2

我在下面包含了整个代码,但我唯一想知道的是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;
}
4

4 回答 4

2
*u |= x;

以上行将 u 指向的整数与位掩码 x 进行或运算。

由于 setBit() 接收指向整数 (uint *u) 的指针。要更改该整数,您必须将其寻址为 *u

于 2015-02-09T08:12:30.163 回答
1

为什么在这里使用指针?

如果没有该指针参数,对所需变量的更改将不会反映在main().

仅供参考,C在参数传递中使用按值传递。因此,您需要传递变量的地址并在指针中收集相同的地址,以使更改反映到main().

根据代码逻辑,您收到的参数是uint* u. 所以要对指针持有的地址处的值进行操作,您需要取消引用运算符*。实际上

*u |= x;

表现得像

(*u) |= x;

因为运算符优先级,这基本上说明了

“获取 u 指向的地址处的值,并将其与 x 中的值进行 OR,并将其存储到 u 指向的地址中”

于 2015-02-09T08:11:32.157 回答
0

(*u |= x)。为什么在这里使用指针?

在上面的语句中,u是指针,但是当您*在指针前面放置一个间接运算符时u,例如*u,您取消引用指针检索指针所指向的

于 2015-02-09T08:14:57.913 回答
0

指针最有可能用于减少重复。替代方案是:

uint setBit (uint u, uint bitNum)

xxx = setBit (xxx, bitNumber);

如果您只打算使用它来设置一个位,那么指针就避免了必须两次指定变量的名称。此外,它还避免了意外创建不执行任何操作的代码的可能性,如下所示:

setBit (xxx, bitNumber);

由于返回值被忽略,这根本不会做任何事情。使用指针的函数,这个错误是不可能犯的。

于 2015-02-09T08:24:59.713 回答