Blogブログ

シフト演算について

エンジニアの信尾海翔です。
第三回目のブログではシフト演算についてまとめたいと思います。

シフト演算とは

シフト演算とはビットを左右にずらして行う演算方法です。

2進数では左に一つ移動すると2倍、右に一つ移動すると1/2倍になります。
10進数では左に一つ移動すると10倍、右に一つ移動すると1/10倍になります。
つまり、〇進数では左に一つ移動すると〇倍、右に一つ移動すると1/〇倍になります。
よく使われるものとしては、論理シフト、算術シフトなどがあります。

論理左シフト(掛け算)

論理左シフトはビット全体を左に移動させます。あふれたビットは消え、空いた場所には0が入ります。

x = 00000010 ※10進数に変換すると2

xを左に1ビット論理左シフトさせると

x = 00000100 ※10進数に変換すると4

xをさらに1ビット論理左シフトさせると

x = 00001000 ※10進数に変換すると8

1回左にシフトするごとに2倍となります。

論理右シフト(割り算)

論理右シフトはビット全体を右に移動させます。あふれたビットは消え、空いた場所には0が入ります。

x = 10000000 ※10進数に変換すると128

xを右にに1ビット論理右シフトさせると

x = 01000000 ※10進数に変換すると64

xをさらに1ビット論理右シフトさせると

x = 00100000 ※10進数に変換すると32

1回右にシフトするごとに1/2倍となります。

論理シフトはすべてのビットを移動させるため、正数のみ、計算することができます。(※負数は左端で符号を扱うため)

算術左シフト(掛け算)

算術左シフトはビット全体を左に移動させます。あふれたビットは消え、空いた場所には0が入ります。

算術左シフトでは左端を符号ビットとして扱うため、左端は固定されます。

x = 11110100 ※10進数に変換すると-12

xを左に1ビット算術左シフトさせると

x = 11101000 ※10進数に変換すると-24

xをさらに1ビット算術左シフトさせると

x = 11010000 ※10進数に変換すると-48

1回左にシフトするごとに2倍となります。

算術右シフト(割り算)

算術右シフトはビット全体を右に移動させます。あふれたビットは消え、空いた場所には符号ビットが入ります。

算術右シフトでは左端を符号ビットとして扱うため、左端は固定されます。

x = 11110100 ※10進数に変換すると-12

xを右に1ビット算術右シフトさせると

x = 11111010 ※10進数に変換すると-6

xをさらに1ビット算術右シフトさせると

x = 11111101 ※10進数に変換すると-3

1回右にシフトするごとに1/2倍となります。

余談

論理シフトは比較的覚えやすいですが、算術シフトは左端を固定、算術右シフトの場合、空いた場所には符号ビットが入ることを忘れがちでよく混乱していたのを覚えています。

信尾

執筆者

Developer

信尾