ねえ、私はビット単位について独学で学んでいて、インターネットのどこかで算術シフト(>>)が半分の数であるのを見ました。私はそれをテストしたかった:
44 >> 1 returns 22, ok
22 >> 1 returns 11, ok
11 >> 1 returns 5, and not 5.5, why?
もう一つの例:
255 >> 1 returns 127
127 >> 1 returns 63 and not 63.5, why?
ありがとう。
ビットシフト演算子は、実際には2で除算しません。代わりに、右側に指定された位置の数だけ、数値のビットを右に移動します。例えば:
00101100 = 44
00010110 = 44 >> 1 = 22
2行目のビットが上の行と同じで、1桁右にシフトしているだけであることに注意してください。次に、2番目の例を見てください。
00001011 = 11
00000101 = 11 >> 1 = 5
これは以前とまったく同じ操作です。ただし、5の結果は、最後のビットが右にシフトされて消え、結果5が作成されるためです。この動作のため、右シフト演算子は通常、2で割ってから捨てるのと同じです。余りまたは小数部分。
バイナリの11は1011です
11 >> 1
バイナリ表現を1ステップ右にシフトすることを意味します。
1011 >> 1 = 101
次に、1 * 1 + 0 * 2 + 1 * 4 = 5であるバイナリの101があります。
これを行った11 >> 2
場合、結果としてバイナリの10、つまり2(1 * 2 + 0 * 1)になります。
1だけ右にシフトすると、sum(A_i * 2 ^ i)[i = 0..n]がsum(A_(i + 1)* 2 ^ i)[i=0..n-1]に変換されます。あなたの数は偶数です(つまりA_0 = 0)それは2で割られます。(カスタマイズされたLateX構文については申し訳ありません... :))
2進数には10進数の概念はありません。切り捨てられた(int)値を返します。
バイナリで11=1011。右にシフトすると、101が表示されます。これは10進数で5です。
ビットシフトは、2^nによる除算または乗算と同じです。整数演算では、結果はゼロに向かって整数に丸められます。浮動小数点演算では、ビットシフトは許可されていません。
内部的にビットシフトすると、ビットがシフトします。丸めとは、単にエッジから外れたビットが削除されることを意味します(実際に正確な値を計算してから丸めるわけではありません)。反対側のエッジに表示される新しいビットは、右側と正の値では常にゼロです。負の値の場合、左側に1ビットが追加されるため、値は負のままになり(2の補数がどのように機能するかを参照)、使用した算術定義は引き続き当てはまります。
ほとんどの静的型付け言語では、操作の戻り型は「int」などです。これにより、整数除算のように、分数の結果が得られなくなります。
(「内部」についてはより良い答えがありますが、型システムの基本を理解するためにそれらを理解する必要はありません。)