1.20 論理シフトと算術シフト

 CASLで扱うシフトには論理シフトと算術シフトがあります。

 論理シフトは符号ビット(先頭ビット,第15ビット,最も左のビット)を含めてシフトするもので、空いたビット位置すべてに0が入ります。
 対する算術シフトは符号ビットを除いてシフトするもので、空いたビット位置すべてに左シフトの時は0、右シフトの時は符号ビットと同じものが入ります。

 以下にCASLにおけるシフトの様子を示します。

 ★シフト演算も「演算シミュレータ」で確かめることができます。



論理シフト

【例】1ビット左論理シフト
(1010 0011 0000 1111)2・・・シフト前
                ←シフト方向
(0100 0110 0001 1112・・・シフト後
                                   ↑
                                 空いたビット位置

【例】1ビット右論理シフト
(1010 0011 0000 1111)2・・・シフト前
                シフト方向→
(101 0001 1000 0111)2・・・シフト後
  ↑
  空いたビット位置


算術シフト 【例】1ビット左算術シフト 符号ビットはシフトしない ↓ (1010 0011 0000 1111)2・・・シフト前 ←シフト方向 (1100 0110 0001 1112・・・シフト後 ↑ 空いたビット位置 【例】1ビット右算術シフト(符号ビットが0の場合) 符号ビットはシフトしない ↓ (0010 0011 0000 1111)2・・・シフト前 シフト方向→ (001 0001 1000 0111)2・・・シフト後 ↑ 空いたビット位置(シフト前の符号ビットが0なので0が入る) 【例】1ビット右算術シフト(符号ビットが1の場合) 符号ビットはシフトしない ↓ (1010 0011 0000 1111)2・・・シフト前 シフト方向→ (101 0001 1000 0111)2・・・シフト後 ↑ 空いたビット位置(シフト前の符号ビットが1なので1が入る)


 1ビット左シフトすると元の値を21倍し、2ビット左シフトすると22倍し、以下nビット左シフトすると2n倍する効果があります。
 逆に、1ビット右シフトすると元の値を1/21し、2ビット右シフトすると1/22し、以下nビット右シフトすると1/2nする効果があります。

 ただしこの効果はオーバーフローの問題と関係しており、絶対値が大きい値の場合にうまくいかないケースもあります。
 なお、ある値を数とみなして、2nまたは1/2nするためにシフトを行う場合は、算術シフトで行うのが無難です。特に、負数(符号ビットが1)の場合は必ず算術シフトでなければこの効果は得られません。


問題

 16進数で表した16ビットの値 #8F37 を以下のとおりシフトする(元の値を別々にシフトする)。
 このとき、シフト後の値を16進数で答えよ。

ア 2ビット左論理シフト
イ 3ビット右論理シフト
ウ 2ビット左算術シフト
エ 3ビット右算術シフト