[記事公開日]2014/12/08
[最終更新日]2016/11/26

基本情報技術者試験 1-6(シフト演算)

 

 

コンピュータは計算するとき、高度なテクニックを使用して計算します。

 

こんな方法があります。

 

●論理右シフト

●論理左シフト

●算術右シフト

●算術左シフト

 

 

手始めにどれか見てみましょう。

 

●論理右(左)シフト

・ケタあふれは捨てる

・空白には「0」を入れる

・左に1ケタ移動・・・値は2倍(2×2×..)となる

・右に1ケタ移動・・・値は1/2倍(1/2×1/2×..)となる

 

<例1>

「1100 100」(100)

2ケタを「論理右シフト」してみます。

0011001」(25)

右へ2ケタズラしました。

論理シフトの特徴として、「右(または左)に溢れた桁は捨てる」ということ、そして、左(右)には「0」を補完させるということです。値の大きさは1/4倍(または2倍)になっています。

 

<例2>

「1100.101」(12+1/2+1/8=12+5/8=12.625)

2ケタ論理左シフトしてみます。

「110010.1」(50.5)

4倍になっています。

 

●左に4ビットずらすと値はいくつになるか?

⇒16倍

 

●1/8倍にするのに右or左に何ビット移動させるか?
⇒右に3ビット

 

 

続きまして・・、

 

●算術右シフト
先頭の符号は残す!!
・ケタあふれは捨てる(論理シフトと同じ)
・空きには符号を入れる

 

<例3>
01100100」

2ケタ算術右シフトしてみます。

00011001

 

先頭の「0」は”プラス”ですよ、という意味を持ちますが、そのまま残します。

※先頭ビットが「1」の場合、この値は「マイナス」ですよという意味になる。

 

符号ビット”0″を残し、
それ以降の2~3ケタ目の”空き”には符号ビット”0″を入れました。

それ以降の4~8ケタ目は変更前の2~6ケタ目を入れました。

 

●算術左シフト
先頭の符号は残す!!
・ケタあふれは捨てる(論理シフトと同じ)
・空きには「0」を入れる  ※符号ではなく

 

<例4>
11001010」

2ケタ算術左シフトしてみます。

10101000

 

先頭の符号ビット「1」はそのまま残します。

 

 

●16進数「ABCD」を2ビット、論理右シフトするといくつになるか?
⇒2AF3

 

16ビットときたら、まず4桁ずつに区切ることを思い出します。

 

「A:10、B:11、C:12、D:13」

「A:1010、B:1011、C:1100、D:1101」

「1010 1011 1100 1101」

これを2ビット、論理右シフトします。

00 1010 1011 1100 11」

「0010 1010 1111 0011」

もう一度計算すると、「2 A F 3」になります。

 

●2の補数「-100」(8ビット)を3ビット、算術右シフトするといくつになるか?

 

まず、負数を問われたら、正の数から2の補数計算をします。

「100:01100100」

2の補数で「-100」にする

「10011100」

※2の補数:「ビット列を反転」させ「+1」をすること

3ビット、算術右をする「11110011」。

※「算術」なので、先頭の符号ビットは残します。

2の補数で戻してあげる

「11110011」→「00001100」→「00001101」(13)
⇒答え -13

 

基本情報技術者試験 1-6(シフト演算)

☆論理右シフト

☆論理左シフト

☆算術右シフト

☆算術左シフト

 

・符号を残すのはどっち?

・”空き”には「0」を入れる?「符号ビット」を入れる?

 

 

以上です

 

 

yamatunes