2

たとえば、20 (バイナリ - 00010100) の 8 ビット整数があります。数値のバイナリ表現での位置を見つけるにはどうすればよいですか? 2 のべき乗を使用して 1 つの場合は実行できますが、複数の場合は行き詰まります

4

5 に答える 5

1

すぐに設定されているビットを見つけるには、これを使用します。

int oneBit = x & ~(x-1);

この後oneBit、最下位ビットのみがx設定されます。
(たとえば、xだった場合0001 0100、oneBit は になります0000 0100)

その後、次の方法で最下位ビットをオフにできます。

x &= x-1;

xだった場合0001 0100、新しいxはずです0001 0000

その後、最初の操作を繰り返して、設定された次の最下位ビットを見つけることができます。

これにより、設定されているビットに直接アクセスし、ゼロのビットをスキップします。

実際の動作を示すコード例を次に示します。

int main(void)
{
    int x = 20;  // 0001 0100

    while (x)
    {
        printf("Low Bit is: %d\n", x & ~(x-1));
        x &= (x-1);
    }
}

出力:

Low Bit is: 4    // eg. 0000 0100
Low Bit is: 16   // eg. 0001 0000
于 2013-09-18T12:54:09.783 に答える
1

ループ内の各ビットをテストするだけです。

char val = 0x42;

for (int i = 0; i < CHAR_BIT; ++i)
    printf("bit %d = %d\n", i, (val & (1 << i)) != 0);

またはおそらくもっと簡潔に:

for (int i = 0; i < CHAR_BIT; ++i)
    printf("bit %d = %d\n", i, (val >> i) & 1);
于 2013-09-18T12:44:34.083 に答える
0

非常に簡単な解決策:

int myNum = 123;
int isOne[32];
for(int ii=0; ii<32; ii++) {
  isOne[ii] = (myNum & 1)?1:0;
  myNum = myNum >> 1;
}  
于 2013-09-18T12:46:11.547 に答える
0

サイクルを実行して、順番に各 1 をチェックする必要があります。予想される結果が位置のリストである場合、答え自体が線形である可能性があるため、線形の複雑さに勝るものはありません。

于 2013-09-18T12:44:31.747 に答える