设置从0到1的整数位

时间:2015-02-09 08:09:45

标签: c pointers bitwise-or

我在下面列出了整个代码,但我唯一想知道的是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 个答案:

答案 0 :(得分:2)

*u |= x;

上面的行或者使用位掩码x来指示u指向的整数。

as setBit()接收指向integer(uint * u)的指针。要更改该整数,您必须将其称为* u

答案 1 :(得分:1)

  

为什么在这里使用指针?

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

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

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

*u |= x;

表现得像

(*u) |= x;

因为operator precedence,基本上是在告诉

&#34;获取u指向的地址的值,并将其与x中的值一起使用,并将其存储到u&#34;

指向的地址中

答案 2 :(得分:0)

  

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

在上面的语句中,u是指针,但是当您将指向*之前的间接操作符u放在*u之前时,您就是取消引用指针检索值指向的指针。

答案 3 :(得分:0)

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

uint setBit (uint u, uint bitNum)

xxx = setBit (xxx, bitNumber);

如果你只是用它来设置一个位,那么指针就不必指定变量的名称两次。此外,它还避免了意外创建无效的代码的可能性,如下所示:

setBit (xxx, bitNumber);

由于忽略了返回值,因此根本不执行任何操作。使用指针的功能,这个错误是不可能的。