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所指整数的位。如果答案为:,则接受该答案。)