シフト演算


シフトとは右が左にずらすこと

○10進数 10を左に1回ずらすと 100 ← 10倍になる  
        右に1回ずらすと   1 ← 1/10倍になる

○2進数 00001010を左に1回ずらすと00010100 ←2倍になる 
            左に2回ずらすと 00101000 ←4倍になる  
     右に1回ずらすと1/2倍、2回ずらすと1/4倍になります
<論理シフトはずらしたあいたビットのところには0を入れ、桁から外れたものは
  捨てていきます。>.

  実はこれは負数を考えない論理シフトといいます。一方、負数を考慮した
  シフトは算術シフトといいます。

    

○それでは負数を考慮した算術シフトはどうなるか
  2進数 11000001を左に1回ずらす 
        1000001
      10000010
      ↑       ↑
      |      0を入れる
      この1は捨てる
  

  2進数 11000001を右に1回 
       1000001
       11000001←この1は捨てる
        ↑      
       あいたビットに符号と同じ値
       を入れる
  符合を除いて桁をずらす 
  左シフトであいたビットには0、右シフトであいたビットには符号と同じ値をいれる


★★★解説:二種向け★(2000/1/24)

 16進小数0.FEDCを4倍した値はどれか。

 ア 1.FDB8

 イ 2.FB78

 ウ 3.FB70

 エ F.EDC0



■解答■
  二種午前平成11年秋問2

>  0.FEDCを2進数に直すと  0.1111 1110 1101 1100
>  4倍すると       11.1111 1011 0111 0000
>  16進数に直す       3.FB70
>  もっと、いい方法があると思うんですけどわかりませんでした。

 どうもありがとうございました。

 0.F だけを計算すれば,この問題は解けましたね。

>福島先生の「完全合格教本」を読んで、基数変換の問題が
>やっと理解できつつあります。うれしい〜。

 よかったですね。

> 0.FEDCの最後の数字Cから、地道に計算しました。
> 16進数のCは、10進数だと12だから、4を掛けると48。
> 16進数にすると、48=16×3+0 だから、繰り上がるのは3、最後の数字は0
> 16進数のDは、10進数だと13だから、4を掛け、繰り上がりの3を足して55。
> 16進数にすると、55=16×3+7 だから、下から2番目の数字は7
> ここまでくると、選択肢が1つに絞られます。

 こういう計算も大切です。シフトを利用するのは,簡単ですが,こちらの計算
のような計算は,計算が得意になるためには重要ですよ。数学の苦手な人は,こ
ちらの計算で練習して下さい。

>0.FEDCの4倍を10進数に変換すると
>
>0.F       E         D             C  × 4
>×  ×       ×         ×             ×
>1   15×4/16 14×4/256  13×4/4096     12×4/65536
>------------------------------------------------------
>0 + 3.75     +0.21875 + 0.0126953125 + 0.000732421875 = 3.982177734375
>
>これを16進数に変換すると
>0.982177734375 × 16 =  15.71484375 --- F
>0.71484375 × 16 = 11.4375 ------------ B
>0.4375 × 16 = 7 ---------------------- 7
>
>よって0.FEDC × 4 = 3.FB70
>
>参考:「第2種情報処理合格ゼミ1 コンピュータ基礎の総合研究」

 どうもありがとうございました。


★★★解説:二種向け★(2000/5/9)

 正の 2 進整数を左に 4 ビットだけ,けた移動(シフト)した結果は元の数の
何倍か。ここで,あふれはないものとする。

 ア 0.0625

 イ 0.25

 ウ 4

 エ 16



■解答■(宿題メールより)
  二種午前平成12年春問4

 エ 16

> 左に4ビットシフトされたので、2^4=16
> よって、16倍。

 どうもありがとうございました。

>左に n ビットシフトすることは、2の n 乗倍することと同じになる。
>また、右に n ビットシフトすることは、2の n 乗倍することと同じに
>なる。
>(技術評論社「第2種コンピュータ基礎の総合研究/平成11年度」p.67より)

 どうもありがとうございました。
 10進数なら,10倍で,2進数なら,2倍でした。


 どうもありがとうございました。


★★★宿題:二種(基本情報技術者)向け★(2000/8/24

 数値を 2 進数で表すレジスタがある。このレジスタに格納されている正の整数
x を 10 倍する方法はどれか。ここで,シフトによるあふれ(オーバフロー)は,
ないものとする。

 ア x を 2 ビット左にシフトした値に x を加算し,更に 1 ビット左にシフ
  トする。

 イ x を 3 ビット左にシフトした値と,x を 2 ビット左にシフトした値を加
  算する。

 ウ x を 3 ビット左にシフトした値に x を加算し,更に 1 ビット左にシフ
  トする。

 エ x を 5 ビット左にシフトする。


(解答)

実際に数字を割り当ててやってみたほうが解りやすいと思います。

10進数    2進数
 3       0011
10進数3を10倍すると30になる。
ア:
0011を2ビット左にシフトしxに加算 → 1100+0011=1111 5倍になる
1111を1ビット左にシフト → 11110(2進数) 30(10進数)  5倍×2=10倍

イ:
0011を左に3ビットシフト → 11000  10進数 24       8倍
0011を左に2ビットシフト → 1100   10進数 12       4倍
足す → 11000+1100=100100(2進数) 36(10進数)  8+4=12倍
ウ:
0011を3ビット左にシフトしxに加算 →11000+0011=11011  9倍
110011を1ビット左にシフト → 110110(2進数) 54(10進数) 9倍×2=18倍

エ:
0011を5ビット左にシフト → 1100000(2進数) 96(10進数)  32倍