この例では 16 ビットを使用してみましょう。その場合は ~0
に等しい
1111111111111111
この n
を左シフトすると ビット (あなたの場合は 3)、取得:
1111111111111000
なぜなら 1
左側の s は破棄され、0
s は右側に供給されます。次に、それを再補完すると、次のようになります:
0000000000000111
n
を取得する賢い方法です 数値の最下位部分の 1 ビット。
あなたが説明する「xビット」は、指定された数値(f994 = 1111 1001 1001 0100
)をシフトしました ) 最下位の 3 ビットが必要なビットになるように、十分に遠くに配置します。この例では、要求している入力ビットがそこにあり、他のすべての入力ビットは .
とマークされています それらは最終結果にとって重要ではないため:
ff94 ...........101.. # original number
>> p+1-n [2] .............101 # shift desired bits to right
& ~(~0 << n) [7] 0000000000000101 # clear all the other (left) bits
ご覧のとおり、関連するビットが右端のビット位置にあります。
最善の方法は、手で問題を解決することです。そうすれば、それがどのように機能するかを理解できます。
これは、8 ビットの unsigned int を使用して行ったことです。
<オール> <リ>数値は 75 で、位置 6 から始まる 4 ビットが必要です。関数の呼び出しは getbits(75,6,4);
<リ>2 進数で 75 は 0100 1011 です
<リ>したがって、最下位ビットから始まる 4 ビット長のマスクを作成します。
~0 =1111 1111
<<4 =1111 0000
~ =0000 1111
マスクを手に入れました。
- ここで、数値から必要なビットを最下位ビットにプッシュして、バイナリ 75 を 6+1-4=3 だけシフトします。
0100 1011>>3 0000 1001
これで、下位の正しいビット数のマスクと、下位の元の数から必要なビットが得られました。
- 私たちと彼ら
0000 1001
& 0000 1111 ============ 0000 1001
したがって、答えは 10 進数の 9 です。
注: 高次のニブルはたまたますべてゼロであるため、この場合はマスキングが冗長になりますが、最初の数値の値に応じて何でもかまいませんでした.
~(~0 << n)
n
を持つマスクを作成します 右端のビットがオンになっています。
0
0000000000000000
~0
1111111111111111
~0 << 4
1111111111110000
~(~0 << 4)
0000000000001111
結果を他の何かと AND すると、それらの n
の内容が返されます ビット。
編集:私がずっと使ってきたこのプログラマー電卓を紹介したいと思います:AnalogX PCalc.