-1

ビット単位の操作についていくつか質問があります。助けていただければ幸いです。

1.)

i = 0x000a;
printf( "2: %x %x %x\n", i, i << 1, i << 2 );
i = 0x0010;
printf( "3: %x %x %x\n", i, i >> 1, i >> 2 );

2)

unsigned int i = 1;
printf( "1: %x %x %x\n", i, ~i, ~~i );
printf( "2: %x %x \n", i, ( 0x0100 & ( 1 << 8 ) ) >> 8 );
printf( "3: %x %x \n", i, 0x0100 ^ ( 1 << 8 ) );
printf( "4: %x %x \n", i, 0x0100 | ( 1 << 4 ) );

これらの質問に対する回答はありますが、その仕組みがわかりません。誰かがそれらを段階的に説明できますか?

前もって感謝します

4

2 に答える 2

3

x<<SOME_VALUExSOME_VALUE回のすべてのビットを左に移動します。したがって0x000a=1010(2)、1ビット左にシフトすると、10100またはになり0x0014ます。この数値をもう一度左にシフトすると、2が乗算されるか、0x0028が生成されます。右シフト(>>)のロジックも同様であり、ここでは説明しません。これはあなたがあなたのコメントで求めていることを説明していると思います。

~整数のすべてのビットを否定するため、すべての0ビットが1になり、その逆も同様です。または(32ビットコンピュータの場合)~0x0001(1(2))ですfffffffe11111111111111111111111111111110(2)二重否定は入力を生成します。

&はビット単位の「and」演算子であり、2項演算子です。2つのオペランドを取り、両方の数値がその位置に1を持っている場合に限り、結果の数値は特定の位置に1を持ちます。

^またはxorは排他的論理和演算子であり、これもバイナリです。ここでは、オペランドの1つが指定された位置に1を持っている場合にのみ、 1があります。

そして最後に'|' は論理または二項演算子であり、そのオペランドの少なくとも1つがこの位置に1を持っている場合にのみ、指定された位置に1を持ちます。

于 2012-12-11T08:18:00.633 に答える
1

私があなたの質問に与えることができる最も簡単な説明は、

右シフト演算子を n ビット適用すると結果は /(2^n) になり、左シフト演算子を n ビット適用すると結果は *(2^n) になります。

例えば、

(10 << 1) は結果 20 を返し、(10 >> 1) は結果 5 を返します。

于 2012-12-11T09:50:44.440 に答える