符号を考慮したシフト演算を算術シフトと呼びます。
符号とは正負を表すビット(符号ビット)のことです。
0=正、1=負
左算術シフト
基本は論理シフトと同じになります。左にn桁ずらすと2^n倍になります。2桁ずらせば2^2倍即ち4倍になります。
実際にやってみます。今回はわかりやすくするため負の数で行ってみます。10進数20の2進数を左に2ビットずらしてみます。
11110100 |←これ10進数ではー12です。一番左の1は符号ビットで負を表すと同時に残りの7ビットで2の補数でも負を表しています。ここがよくわからない方は2進数の負の表現をご確認ください。
↓
11010000 |←これ10進数ではー48です。1010000は2の補数なので1010000 – 1 したものをビット反転させると48になります。
左算術シフトの注意点
上記の例では符号ビット1とはみ出した数字1が同じでしたので問題ありませんが、はみ出した数字が0の場合はオーバーフローになります。
右算術シフト
右も基本は変わりません。2桁ずらせば1/2^2即ち1/4になります。ただずらして空いたビットには符号ビットの値と同じ値を捕捉します。実際に見てみましょう。
11110100 |←これ10進数ではー12です。
↓
11111101 |←これ10進数ではー3です。
このようにずらしたところに1を捕捉しています。
1:11:11101 符号ビット:捕捉したビット:元から存在しているビット
の形になっていることが確認できると思います。
この符号ビットと同じ値以外で捕捉してしまうとオーバーフローになってしまいます。
ちなみにはみ出した時の数値は割り算のあまりというのは論理演算と同じです。
コメントを残す