设置从 0 到 1 的整数位
Setting a bit of an integer from 0 to 1
我在下面包含了整个代码,但我唯一想知道的是 setBit
函数。 x = 1 << bitNum
只会将 0001 向左移动很多空格,具体取决于 bitNum
是什么数字,但我不明白最后一行 (*u |= x)
为什么这里使用指针?
#include <stdio.h>
typedef unsigned int uint;
int checkBit(uint u, uint bitNum);
void setBit(uint* u, uint bitNum);
int countOnes(uint u);
int main()
{
uint xxx, bitNumber;
printf("\n Enter decimal integer xxx: ");
scanf("%u", &xxx);
printf("\n xxx in decimal: %u", xxx);
printf("\n xxx in hex: %x", xxx);
////// Test countOnes function /////////////
printf("\n Number of ones in xxx: %d", countOnes(xxx));
////// Test checkBit function /////////////
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
////// Test setBit function /////////////
printf("\n Enter bit to set: ");
scanf("%u", &bitNumber);
printf("\n Setting bit %d of xxx", bitNumber);
setBit(&xxx, bitNumber);
printf("\n xxx in hex: %x", xxx);
printf("\n");
return 0;
}
int countOnes(uint u)
{
int bitCount;
for(bitCount = 0; u; u = u >> 1)
{
bitCount += u & 1;
}
return bitCount;
}
void setBit(uint* u, uint bitNum)
{
int x;
x = 1 << bitNum;
*u |= x;
}
int checkBit(uint u, uint bitNum)
{
int x = u >> bitNum;
if(x & 1 == 1)
return 1;
else
return 0;
}
Why is a pointer used here?
如果没有该指针参数,对所需变量的更改将不会反映在 main()
中。
仅供参考,C
在参数传递中使用按值传递。因此,您需要传递变量的地址并将其收集在指针中,以将更改反映到 main()
.
中的实际变量
按照代码逻辑,你收到的参数是uint* u
。因此,要对指针 所在地址处的 值进行操作,您需要解引用运算符 *
。实际上
*u |= x;
表现得像
(*u) |= x;
因为operator precedence,基本上是在说
"get the value at address pointed by u and OR it with the value in x and store it into the address pointed by u"
*u |= x;
上一行将 u 指向的整数与位掩码 x 进行或运算。
因为 setBit() 接收到指向整数 (uint *u) 的指针。要更改该整数,您必须将其作为 *u
(*u |= x). Why is a pointer used here?
在上面的语句中,u
是指针,但是当你在指针u
前面放置一个间接运算符*
时,比如*u
,你是取消引用指针检索值 指向 的指针。
最有可能使用指针来减少重复。备选方案是:
uint setBit (uint u, uint bitNum)
xxx = setBit (xxx, bitNumber);
如果您只打算用它来设置位,则指针可以避免必须指定变量名称两次。此外,它还避免了意外创建不执行任何操作的代码的可能性,如下所示:
setBit (xxx, bitNumber);
由于忽略了 return 值,因此这根本不会执行任何操作。有了带指针的函数,就不可能犯这个错误了。
我在下面包含了整个代码,但我唯一想知道的是 setBit
函数。 x = 1 << bitNum
只会将 0001 向左移动很多空格,具体取决于 bitNum
是什么数字,但我不明白最后一行 (*u |= x)
为什么这里使用指针?
#include <stdio.h>
typedef unsigned int uint;
int checkBit(uint u, uint bitNum);
void setBit(uint* u, uint bitNum);
int countOnes(uint u);
int main()
{
uint xxx, bitNumber;
printf("\n Enter decimal integer xxx: ");
scanf("%u", &xxx);
printf("\n xxx in decimal: %u", xxx);
printf("\n xxx in hex: %x", xxx);
////// Test countOnes function /////////////
printf("\n Number of ones in xxx: %d", countOnes(xxx));
////// Test checkBit function /////////////
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
printf("\n Enter bit to check: ");
scanf("%u", &bitNumber);
printf("\n Bit %d is %d", bitNumber, checkBit(xxx, bitNumber));
////// Test setBit function /////////////
printf("\n Enter bit to set: ");
scanf("%u", &bitNumber);
printf("\n Setting bit %d of xxx", bitNumber);
setBit(&xxx, bitNumber);
printf("\n xxx in hex: %x", xxx);
printf("\n");
return 0;
}
int countOnes(uint u)
{
int bitCount;
for(bitCount = 0; u; u = u >> 1)
{
bitCount += u & 1;
}
return bitCount;
}
void setBit(uint* u, uint bitNum)
{
int x;
x = 1 << bitNum;
*u |= x;
}
int checkBit(uint u, uint bitNum)
{
int x = u >> bitNum;
if(x & 1 == 1)
return 1;
else
return 0;
}
Why is a pointer used here?
如果没有该指针参数,对所需变量的更改将不会反映在 main()
中。
仅供参考,C
在参数传递中使用按值传递。因此,您需要传递变量的地址并将其收集在指针中,以将更改反映到 main()
.
按照代码逻辑,你收到的参数是uint* u
。因此,要对指针 所在地址处的 值进行操作,您需要解引用运算符 *
。实际上
*u |= x;
表现得像
(*u) |= x;
因为operator precedence,基本上是在说
"get the value at address pointed by u and OR it with the value in x and store it into the address pointed by u"
*u |= x;
上一行将 u 指向的整数与位掩码 x 进行或运算。
因为 setBit() 接收到指向整数 (uint *u) 的指针。要更改该整数,您必须将其作为 *u
(*u |= x). Why is a pointer used here?
在上面的语句中,u
是指针,但是当你在指针u
前面放置一个间接运算符*
时,比如*u
,你是取消引用指针检索值 指向 的指针。
最有可能使用指针来减少重复。备选方案是:
uint setBit (uint u, uint bitNum)
xxx = setBit (xxx, bitNumber);
如果您只打算用它来设置位,则指针可以避免必须指定变量名称两次。此外,它还避免了意外创建不执行任何操作的代码的可能性,如下所示:
setBit (xxx, bitNumber);
由于忽略了 return 值,因此这根本不会执行任何操作。有了带指针的函数,就不可能犯这个错误了。