左シフト演算はビットを左にずらして,空いた右端には「0」を入れる演算です.なお,シフト演算には論理シフトと算術シフトがありますが,ここでは論理シフトを考えています.
左シフトを実行するには <<
を使います.まず,1 ビット左にシフトします.
a = 0b01110101 # 117
print(bin(a))
print(bin(a << 1))
0b1110101 0b11101010
表示桁を揃えた方が理解しやすいかもしれません.
a = 0b01110101 # 117
print(f'{a:#010b}')
print(f'{a << 1:#010b}')
0b01110101 0b11101010
次に,3 ビット左にシフトします.
a = 0b01110101 # 117
print(bin(a))
print(bin(a << 3))
0b1110101 0b1110101000
なお,10 進数の世界で,100 を 1 桁左にずらすと 10 倍(= 10 の 1 乗倍)の 1000 になり,3 桁左にずらすと,1000 倍(= 10 の 3 乗倍)の 100000 になります.2 進数の世界では,1 ビット左にシフトすると,2 の 1 乗倍(つまり 2 倍)になり,3 ビット左にシフトすると 2 の 3 乗倍(つまり 8 倍)になります.実際に確かめてみましょう.117 を 1 ビット左シフトすると,234 (= 117 x 2) になります.
a << 1 # 2倍
234
117 を 3 ビット左シフトすると,936 (= 117 x 8) になります.
a << 3 # 8倍
936
右シフト演算はビットを右にずらして,空いた左端には「0」を入れる演算です.なお,ここでも論理シフトを考えています.右シフト演算は >>
を使います.
a = 0b11110101 # 245
print(bin(a))
print(bin(a >> 1))
0b11110101 0b1111010
表示桁数を揃えると,先頭に 0 が補われていることがよくわかります.なお,右端にあった 1 は切り捨てられていることにも注意してください.
a = 0b11110101 # 245
print(f'{a:#010b}')
print(f'{a >> 1:#010b}')
0b11110101 0b01111010
3 ビットの右シフト演算も行ってみます.
a = 0b11110101 # 245
print(f'{a:#010b}')
print(f'{a >> 3:#010b}')
0b11110101 0b00011110
1 ビットの左シフト演算が 2 倍になることと同様に, ビットの右シフト演算では 1/2 倍になります.つまり,245 を 1ビット右シフト演算すると 1/2 倍したあと切り捨てられて 122 になります.
a
245
a >> 1 # 1/2 倍
122
245 を 3 ビット右シフト演算すると,1/8 倍したあと切り捨てられて 30 になります.
a >> 3 # 1/8 倍
30