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