論理シフト

ここでは論理(ろんり)シフトをとり上げます。

ここでのシフトは、符号なしの2進数を取り扱います。つまり負の数(もちろん補数表現)と無縁(関係ない)な2進数を扱うと考えてください。負数 (補数表現)を扱う場合は次のページで 説明するように、算術(さんじゅつ)シフトといって区別をします。
話しを簡単にするために、 8ビット(=1バイト)で考えます。

 左シフトと右シフトの具体例

2進数の110010 つまり
0011 0010
(2)= 50(10)について、
 �〆犬烹吋咼奪函複韻韻拭縫轡侫箸垢襦�
 �∈犬烹殴咼奪箸世吋轡侫箸垢襦�
 �1Δ烹吋咼奪箸世吋轡侫箸垢襦�
 �けΔ烹殴咼奪肇轡侫箸垢襦�
 その結果は、
 � 。娃隠隠� 0100 
 �◆。隠隠娃� 1000
 �� 0001 1001
 �ぁ。娃娃娃� 1100  となります。
次の具体例では、�△鉢い鮴睫世靴討△蠅泙后�
論理シフトで大切なことは、つぎの通りです。

あふれ出たものは捨てる(すてる)、

空欄(空いたビット)に0を入れる。
さて、元の数は 10進数で 50(10)であり、
10進数で表して見ると、
 �,�、100  (2倍になる)
 �△�、 200 (4倍になる)
 ��が、 25  (倍にな る)
 �い�、 12  (倍) 等となっています。
ただし、�い琶�かる通り、余り1は捨てています。
10進数に直してみたらはっきり分かるように、
左シフトは、順に2倍、4倍、8倍、‥‥ 
右シフトは、倍、倍、倍、‥‥

することです。シフトは、掛けること、割ることと同じ意味をもつのです。

シフト記号 <<   >> 

左シフトは<<を用いる。
Aをmビットだけ左シフトは A << mとかく。

右シフトは>>を用いる
Aをmビット右シフトは A >>  mとかく。
上の例で
�△任�  0011 0010 << 2  =  1100 1000
 
�い任�  0011 0010 >> 2 =  0000 1100

シフト演算で掛け算 が出来る


(例1)2進数の 10011 を5倍する。
8ビット(1バイト)で扱いました。
   A = 0001 0011 とおきます
A<<2 = 0100 1100  (4倍の4Aですネ)
--------------------------------
          0101 1111 
   (上のAと加え、5Aです)
 10進数では A=19
          5A=95  です
 5A=4A+A です。
  4A(4倍)は2ビットだけ左シフトです。

 10進数で確かめて見ました。
 正しい結果であることが分かります。

(例2)10011
(2)×17(17倍です)
8ビットではなく、10ビットのBoxを用意しました。シフトによりあふれ出る1を有効にするためです。
(8ビットでは符号なし最大数が255です)
10進数では A=19
      17A=323
  01 0100 0011(2)=323(10)
 だから、正しい結果です。
A = 00 0001 0011 とおきます
A<<4 = 01 00 11 0000  (16A つまり 16倍)
--------------------------------
 加えて   01 0100 0011 
 (A+16A=17Aです)

シフト演算により掛け算が出来ます。
実際にコンピュータ内部では、シフト計算を繰り返して掛け算を実行しているようなんです。

次はホントの情報処理試験の問題です

問 数値を2進数で格納するレジスタがある。 このレジスタに正の整数Xを入れた後、“レジスタの値を2ビット左にシフトして、これにX を加える” 操作を行うと、 レジスタの値はX の何倍になるか。ここで、シフトによるあふれ(オーバフロー)は、発生しないものとする。
   ア 3    イ 4    ウ 5    エ 6
平成15年の出題です。レジスタとは、8ビットとか16ビットのBoxと思えばいいでしょう。
    答は【ウ】

問
 32 ビットのレジスタに 16 進数 ABCD が入っているとき,2ビットだけ右に論理シフトしたときの値はどれか。
   ア 2AF3   イ 6AF3  ウ AF34  エ EAF3
16年の出題
32ビットのBox は大きいですが…
   答は【ア】

いつものことながら問題です m(^▽^)m

次を10ビットの範囲(大きさ)で考えて下さい。
� 。隠娃娃隠院�<< 4
�◆。隠娃娃隠院�>> 4
�� 10011 を 10(10進)倍する
 ここで 10011は2進数です。 はみ出し過ぎないように10ビットの大きさにしました。
ここでは論理シフトです。つまり、すべて符号なし2進数を扱います。だからここでは補数も扱いません。
また、10進数にて確かめてください。
 答えは次ページへ。

前ページ問題の答えです

1問 ( 50 OR 100 ) XOR (- 100)
  = 118 XOR (-100)
  = -22

2問 50 AND ( 100 XOR (-100) ) 
  = 50 AND (-8)
  = 48
 
 どれも結果のみ書きましたが、2進数に置き換えてからビット演算をやりますよ。
プログラム電卓にて確認をしてみましょう。
8ビットの範囲で扱いますから、「byte」ボタンにチェックしておきます。 ( )も含めて問題通り入力したら最後に「=」です。

負数 例えば10進数の −100 が直接は入力出来ないとき、99 「NOT」と考えると便利です。
否定で NOT 99 = -100 ですから。


<注意*>シフト記号について、論理シフトと 次のページであつかう 算術シフトを区別する場合があります。
 そのときは、論理シフトに <<< と >>>  算術シフトに <<  と >> を使います。