设置从 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 值,因此这根本不会执行任何操作。有了带指针的函数,就不可能犯这个错误了。