シフト演算
シフトとは右が左にずらすこと
○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回ずらす
11000001
110000010
↑ ↑
| 0を入れる
この1は捨てる
2進数 11000001を右に1回
11000001
111000001←この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倍