2

以下にコード全体を含めましたが、私が疑問に思っているのはsetBit関数だけです。x = 1 << bitNum0001をシフトするだけですが、数字に応じて左に多くのスペースがありますが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

0

ポインターは、繰り返しを減らすために使用される可能性が最も高いです。代替手段は次のとおりです。

uint setBit (uint u, uint bitNum)

xxx = setBit (xxx, bitNumber);

それを使用してビットを設定するだけの場合、ポインターは変数の名前を 2 回指定する必要がなくなります。また、次のように、何もしないコードを誤って作成する可能性も回避します。

setBit (xxx, bitNumber);

戻り値が無視されたので、これは何もしません。関数がポインターを受け取るため、この間違いは起こりません。

于 2015-02-09T08:24:59.713 に答える
0

(*u |= x)。ここでポインタが使用されるのはなぜですか?

上記のステートメントでは、 はポインターですが、 のようにポインターの前にu間接演算子を配置すると、ポインターが指す値取得するポインターを逆参照しています。*u*u

于 2015-02-09T08:14:57.913 に答える