シフト演算

ざっくりいうと数字の桁をずらすということになります。

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がはみ出ますね。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)