C 将整数的位从0设置为1
我已经包括了下面的全部代码,但我唯一想知道的是C 将整数的位从0设置为1,c,pointers,bitwise-or,C,Pointers,Bitwise Or,我已经包括了下面的全部代码,但我唯一想知道的是setBit函数x=1 这里为什么使用指针 #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
setBit
函数<代码>x=1
这里为什么使用指针
#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;
}
如果没有该指针参数,对所需变量的更改将不会反映在main()
中
仅供参考,C
在参数传递中使用传递值。因此,您需要传递变量的地址,并将其收集到指针中,以获得反映到main()
中实际变量的更改
根据代码逻辑,您收到的参数是uint*u
。因此,要对指针所在地址的值进行操作,需要解引用运算符*
。实际上
*u |= x;
表现得像
(*u) |= x;
因为,这基本上说明了问题
“获取u指向的地址处的值,或将其与x中的值一起存储到u指向的地址中”
第2行上方的OR是由u和位掩码x指向的整数
As setBit()接收指向整数(uint*u)的指针。要更改该整数,必须将其寻址为*u
(*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;
}
在上面的语句中,
u
是指针,但当您将间接运算符*
放在指针u
前面时,例如*u
,您将取消引用指针检索指针指向的值 指针最有可能用于减少重复。另一种选择是:
uint setBit (uint u, uint bitNum)
xxx = setBit (xxx, bitNumber);
如果您只打算使用它来设置一个位,那么指针可以避免两次指定变量的名称。此外,它还避免了意外创建不执行任何操作的代码的可能性,例如:
setBit (xxx, bitNumber);
因为返回值被忽略,所以这根本不起作用。如果函数使用指针,则不可能犯此错误。*u用于设置u所指整数的位。如果答案为:,则接受该答案。)