1

「コンピュータシステム」で機能を見つけました:

int fun_a(unsigned x){
    int val = 0;
    while(x){
        val ^= x;
        x >>= 1;
    }
    return val & 0x1;
}

x に奇数の「1」が含まれる場合は 1 を返し、x に偶数の「1」が含まれる場合は 0 を返します。「val & 0x1」チェック val が奇数または偶数であることは知っていますが、val のビット数をどのようにカウントするかはわかりません。

4

2 に答える 2

4

valビットを正確にカウントするわけではありませんが、XOR は のビットごとに下位ビットを 1 回反転しxます。1奇数回ひっくり返すと になります。

の他の多くのビットも反転しますvalが、return ステートメントでマスクされているため、関係ありません。

于 2012-05-28T09:59:50.323 に答える
0

ビットいじりを行うときは、通常、数値ではなく、ビットの配列の代わりに考えたいと思うでしょう。^すべてのビットで加算 mod 2 を実行します。ほんのわずかvalな問題なので、何が起こっているのですか?

valただし、ほとんどのコンピューター アーキテクチャでは問題は発生しませんが、実際には署名されていない必要があります。実際、このような関数を使用している状況では、 のような固定幅の整数型を使用する必要がありますuint32_t

于 2012-05-28T10:06:35.707 に答える