シフト演算
5510という10進数の数字がある。
左に1桁ずらすと55100になり10倍になる。
右にずらすと551になり1/10倍になる。
2進数の110の数字がある。
110を左にずらすと1100になり2倍になる。
右にずらすと11になり1/2倍になる。
この左、右にずらす操作をシフト操作
という。
気づき
このシフト操作が掛け算、割り算に使えるらしいがどういうことだろうか?
次を見ていこう。
論理シフト
仮に8ビットの数値00101100
(10進数は44)をシフト操作してみる。
一桁左にシフト操作すると2^n倍
になる。
一桁右にシフト操作すると1/2^n倍
になる。
左に2桁シフト操作
10110000
(10進数は176)
右に2桁シフト操作
00001011
(10進数は11)
こうシフト操作していると先頭の1が0に0が1になったりする。
なので符号が反対になる場合がある。
このように符号を考慮せずに行うシフト操作を論理シフト
という。
気づき
論理シフト頭が混乱しそうだ。
演習問題はどんなものになっているのか不安だ。
もし論理シフトでずらされてた数字が1の場合
左論理シフトではみ出した場合
そのビット数で表せる範囲を超えたことを意味する。(オーバフロー)
右論理シフトではみ出した場合
はみ出した数字は余りになる。
気づき
2^nで掛けるとになるとオーバフローになる。
2^nで割ると余りになる。
ずらしただけで掛け算割り算ができるなんてすごいな。
あまりになるのは想像するのは何か違和感があるけどとりあえず覚えよう。
算術シフト
上では符号に考慮せずにシフト操作を行っていた。
それだけでなく考慮するシフト操作がある。それが算術シフト
だ。
仮に111001100
(10進数では−28)で試してみる。
左に算術シフト
10010000
(10進数では−112)
4倍になる。
右に算術シフト
11111101
(10進数では−7)
1/4倍になる。
掛け算と割り算を見てみよう
掛け算を行う
=x*(4+2+1)
=x*(2^2+2^1+2^0)
でそれぞれ分配して計算を行う。
仮に3*7を行う。
=3*(4+2+1)
=32^2+32^1+3*2^0
2^2倍は2桁上げるので
11が1100(10進数は12)になる。
このように桁を上げて、足していく。
割り算を行う
15/3
1111/11
1111から11は何回引けるかで割り算が成立する。
1111/11をするときは1111ー1100(4回分)
11/11をする時は11-11(一回分)
これを繰り返す5回引けたので5で割ることができた。