符号付き数値の左シフトまたは右シフトの出力を決定する簡単な方法はありますか? このページでは、左シフトをexpr1*2*expr2
、右シフトを と説明していますが、CI のexpr1/2*expr2
ようなものを試してみると27 << 5
、 より大きい値が得られます27*2*5 = 270
。-27 << 4
また、またはなどの負の入力の場合-120 >> 5
、これらの操作はどのように機能しますか? シフトで作業する際に考慮する必要がある特別なケースはありますか?
2 に答える
シフトは、引数の積の 2 倍だけでなく、 2 の累乗による乗算と同等です。つまり、 27 << 5 == 27 * 2 5です。右シフトは床除算と同等ですが、負のオペランドに対しては定義されていません。
*
固定の 2 乗で乗算または除算する場合は、 or/
演算子を使用して書き出す方がはるかに望ましいです。コンパイラは、可能であればこれをより高速なシフト演算に変換し、負の数や演算の順序などの荒いエッジを回避します。
Wikipediaなど、より深く掘り下げるのに役立つリソースがたくさんあります (または、プラットフォーム固有でない質問については、MSDN の前に参照する必要があります) 。
バイナリの桁数だけ(左に)シフトする場合、それはシフトによる乗算ではありません。2^shift
これは(2のシフトの累乗)による乗算です。
例えば
shift multiplier
1 2
2 4
3 8
4 16
右シフトは同じですが、事実上除算です。
だから.. 27 << 5
これは:
27 == 00000000 00011011
27 << 5 == 00000011 01100000 == 864
そして右にシフト:
27 >> 1 == 00000000 00001101 == 13
27 >> 2 == 00000000 00000110 == 6
27 >> 3 == 00000000 00000011 == 3
27 >> 4 == 00000000 00000001 == 1
27 >> 5 == 00000000 00000000 == 0
負の数をシフトすると、通常、左端のビットが保持されると思います。でもわかりません。正直なところ、私は符号なしの数値をシフトしただけであり、個人的には符号付きの値をシフトすることを信用しません。
シフトするときはいつでも、切り捨てに注意する必要があります(つまり、一部のビットが失われます)。多くの場合、ゼロビットが切り捨てられるだけですが、十分にシフトする(または右にシフトする)と、1ビットが失われます。これは整数型の容量に依存し、間違いなくあなたの利益のために利用することができます。