| |
|
![]() |
論理シフト
ここでは論理(ろんり)シフトをとり上げます。
ここでのシフトは、符号なしの2進数を取り扱います。つまり負の数(もちろん補数表現)と無縁(関係ない)な2進数を扱うと考えてください。負数
(補数表現)を扱う場合は次のページで 説明するように、算術(さんじゅつ)シフトといって区別をします。
話しを簡単にするために、 8ビット(=1バイト)で考えます。
0011 0010(2)= 50(10)について、
�〆犬烹吋咼奪函複韻韻拭縫轡侫箸垢襦�
�∈犬烹殴咼奪箸世吋轡侫箸垢襦�
�1Δ烹吋咼奪箸世吋轡侫箸垢襦�
�けΔ烹殴咼奪肇轡侫箸垢襦�
その結果は、
� 。娃隠隠� 0100
�◆。隠隠娃� 1000
�� 0001 1001
�ぁ。娃娃娃� 1100 となります。
次の具体例では、�△鉢い鮴睫世靴討△蠅泙后�
さて、元の数は 10進数で
50(10)であり、左シフトと右シフトの具体例
2進数の110010 つまり0011 0010(2)= 50(10)について、
�〆犬烹吋咼奪函複韻韻拭縫轡侫箸垢襦�
�∈犬烹殴咼奪箸世吋轡侫箸垢襦�
�1Δ烹吋咼奪箸世吋轡侫箸垢襦�
�けΔ烹殴咼奪肇轡侫箸垢襦�
その結果は、
� 。娃隠隠� 0100
�◆。隠隠娃� 1000
�� 0001 1001
�ぁ。娃娃娃� 1100 となります。
次の具体例では、�△鉢い鮴睫世靴討△蠅泙后�
- 論理シフトで大切なことは、つぎの通りです。
- あふれ出たものは捨てる(すてる)、
- 空欄(空いたビット)に0を入れる。
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
左シフトは、順に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 は大きいですが…
答は【ア】
ア 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進数にて確かめてください。
答えは次ページへ。
� 。隠娃娃隠院�<< 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 ですから。
<注意*>シフト記号について、論理シフトと 次のページであつかう 算術シフトを区別する場合があります。
そのときは、論理シフトに <<< と >>> 算術シフトに << と >> を使います。
= 118 XOR (-100)
= -22
2問 50 AND ( 100 XOR (-100) )
= 50 AND (-8)
= 48
どれも結果のみ書きましたが、2進数に置き換えてからビット演算をやりますよ。
8ビットの範囲で扱いますから、「byte」ボタンにチェックしておきます。 ( )も含めて問題通り入力したら最後に「=」です。
負数 例えば10進数の −100 が直接は入力出来ないとき、99 「NOT」と考えると便利です。
否定で NOT 99 = -100 ですから。
<注意*>シフト記号について、論理シフトと 次のページであつかう 算術シフトを区別する場合があります。
そのときは、論理シフトに <<< と >>> 算術シフトに << と >> を使います。
| |
|
![]() |

