Subsections
10進数を10倍,100倍,1000倍,

するのは簡単である.

倍するためには,
左にゼロを

個付ければ良い.これは,左シフトである.同様に

倍,

倍,

倍,

するのは簡単である.

倍するためには,小数点の位置を

個左に寄せれば良い.これは右シフトである.
16進数の場合も同じである.たとえば,
を
倍や
倍,
倍や
倍すると
となる.やはり,右や左にシフトさせれば良い.
2進数の場合も全く同じである.この場合,
の計算が簡単である.
が正の整数
の場合,左に
ビットシフトさせる.一方,
が負の整数の場合,
の絶対値分,右
にシフトさせる.
CASL IIで取り扱う16ビットの整数を

倍する事を考える.もし,その16ビットが正
で有れば,それは簡単である.先に示したように,

ビット右や左にシフトさせれば良
い.
問題は,符号付き整数で,第15ビットが1の負の場合である.これは,実例を示した方が
分かりやすい.たとえば,
を2倍と4倍する事を考える.2倍すると
で,4倍すると
である.それぞれを,2の補数で取り扱うと,
となる.
従って,CASL IIの符号付き16ビット整数の場合,

する場合は,左に

ビットシフ
トさせて,空いたビットに0を入れれば良い.
次に,1/2倍と1/4倍する事を考える.すると
となる.この場合も右に

ビットシフトさせれば良いのであるが,空いたビットには1を
入れなくてはならない.
[ |
---|
l]ポイント
- 符号無し整数の場合
倍する場合,左に
ビットシフトさせて,空いたビットに0
を入れればよい.
倍する場合,右に
ビットシフトさせて,空いたビットに0
を入れればよい.
- 符号付き整数の場合
倍する場合,左に
ビットシフトさせて,空いたビットに0を入れればよい.
倍する場合,右に
ビットシフトさせて,空いたビットには符号ビッ
トを入れればよい.
|
CASL IIの整数をビットシフトを用いて2で割ったりすると,端数(小数部)が生じる.この
端数は,16ビットを越えるので,無視される.ここで,商が切り上げなのか切り下げなの
か,疑問が発生する.これについても,実際の整数で考える.
と
を1ビット右にシフトさせて,1/2倍してみる.
この結果から,以下のようにまとめることができる.
[ |
---|
l]ポイント
- 正の整数の場合,端数は切り下げとなる.
- 負の整数の場合,端数は切り上げとなる.
|
算術シフト命令は,左シフト(SLA)と右シフト(SRA)の2つがある.いずれも,符号付き整
数を取り扱い,前者は

倍,後者は

倍する.算術シフト命令は,符号も考慮
していることが重要である.
命令語 |
SLA |
語源 |
Shift Left Arithmetic
(shift:移す left:左 arithmetic:算術) |
役割 |
レジスタの内容をnビット左に移動させる.空いたビットには,0
が入る. これは,符号付き整数を
倍しているのと同じ. |
書式 |
教科書(p.59)の通り.第一オペランドは汎用レジスター.第二オ
ペランドはアドレス. |
機能 |
教科書(p.59)の通り |
フラグレジスタ |
教科書(p.59)の通り.
|
この命令は,符号付き整数を
倍する.従って,シフトにより空いたビットには,0
が入る.
SLA GR0,2 ;GR0の内容を2ビット左へシフト
SLA GR0,0,GR1 ;GR0の内容をGR1の値,左へシフト
命令語 |
SRA |
語源 |
Shift Right
Arithmetic
(shift:移す right:右 arithmetic:算術) |
役割 |
レジスタの内容をnビット右に移動させる. 空いたビットには,
符号ビットが入る.これは,符号付き整数を
倍しているのと同じ. |
書式 |
教科書(p.62)の通り.第一オペランドは汎用レジスター.第二オ
ペランドはアドレス. |
機能 |
教科書(p.62)の通り |
フラグレジスタ |
教科書(p.62)の通り.
|
この命令は,符号付き整数を
倍する.従って,シフトにより空いたビットには,
符号ビットが入る.
SRA GR0,2 ;GR0の内容を2ビット右へシフト
SRA GR0,0,GR1 ;GR0の内容をGR1の値,右へシフト
論理シフト命令は,左シフト(SLL)と右シフト(SRL)の2つがある.いずれも,符号無し整
数を取り扱い,前者は

倍,後者は

倍する.論理シフト命令は,符号は考慮
していない.
命令語 |
SLL |
語源 |
Shift Left Logical
(shift:移す left:左 logical:論理上の) |
役割 |
レジスタの内容をnビット左に移動させる.空いたビットには,
0が入る.これは,符号無し整数を
倍しているのと同じ. |
書式 |
教科書(p.65)の通り.第一オペランドは汎用レジスター.第二オ
ペランドはアドレス. |
機能 |
教科書(p.65)の通り |
フラグレジスタ |
教科書(p.65)の通り.
|
この命令は,符号無し整数を
倍する.従って,シフトにより空いたビットには,0
が入る.
SLL GR0,2 ;GR0の内容を2ビット左へシフト
SLL GR0,0,GR1 ;GR0の内容をGR1の値,左へシフト
命令語 |
SRL |
語源 |
Shift Right
Logical
(shift:移す right:右 logical:論理上の) |
役割 |
レジスタの内容をnビット右に移動させる.空いたビットには,
0が入る.これは,符号付き整数を
倍しているのと同じ. |
書式 |
教科書(p.67)の通り.第一オペランドは汎用レジスター.第二オ
ペランドはアドレス. |
機能 |
教科書(p.67)の通り |
フラグレジスタ |
教科書(p.67-68)の通り.
|
この命令は,符号無し整数を
倍する.従って,シフトにより空いたビットには,
符号ビットが入る.
SRL GR0,2 ;GR0の内容を2ビット右へシフト
SRL GR0,0,GR1 ;GR0の内容をGR1の値,右へシフト
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2006-01-29