K&R C の第 2 章の getbits() メソッドを理解するのに助けが必要

この例では 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

マスクを手に入れました。

  1. ここで、数値から必要なビットを最下位ビットにプッシュして、バイナリ 75 を 6+1-4=3 だけシフトします。

0100 1011>>3 0000 1001

これで、下位の正しいビット数のマスクと、下位の元の数から必要なビットが得られました。

  1. 私たちと彼ら
  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.