ざっくりいうと数字の桁をずらすということになります。
200という10進数を左にずらして空いたところに0を入れれば2000(10倍)となりますね。
逆に右にずらして0を捨ててしまえば20(10分の1)になります。
上記ではわかりやすく10進数で例を考えてみましたが、コンピュータは2新数でこれを行い2倍、2分の1という計算を行なっています。
論理シフト
シフト演算で符号(+ー)を考慮せずに行うものを論理シフトと呼びます。
論理左シフト
次のビット列を3つ論理左シフトしてみます。ちなみに次の2進数は10進数では20で8ビットで表しています。
00010100 |←これ10進数では20
↓
10100000 |←これ10進数では160
論理シフトの法則
この論理左シフトを3つ下2進すうを10進数に変換してみると32+128で160となります。(8桁目と6桁目が1なので2^7=128、2^5=32)
この結果、実は法則があります。基数にずらした桁数(ここでは3)の数でべき乗した数を元の数に掛け算するというものです。言葉ではわかりにくいので以下に数式を書いてみます。
2 ^ 3 x 20 = 160
基数 ^ ずらした桁数 x 元の数 = ずらした後の数
論理右シフト
次に右側にシフトした例を見てみます。
00010100
↓
00000010
結果を10進数に直してみますと2になりますね。右も似たような計算になります。基数にずらした桁数をべき乗して分母とし、分子を元の数とした値になります。
2 ^ 3 = 8
1/8 x 20 = 20/8 = 2
論理シフトの注意点
前述の2進数は8ビット(8桁なので)でした。左シフトも右シフトも桁あふれした数字が0ならば前述の計算式が成り立ちます。しかし、桁あふれした数字が1の場合、特に左の場合は計算が成り立ちません。これはあふれた数字が0であれば8ビット内で表現できる数なので計算が成り立ちます。ただ1だと表現するのに9ビット必要になるためです。右の場合は成立しますが、桁あふれした数字が1の場合は要注意と覚えておきましょう。
ちなみに左論理シフトで1が桁あふれした場合はオーバーフローになります。
右論理シフトで1が桁あふれした場合は割り算のあまりになります。
例えば11を2で割るとあまりは1です。
1011を右に1つ論理シフトすると
0101→1となり1がはみ出ますね。
コメントを残す