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を
入れなくてはならない。
ポイント |
---|
- 符号無し整数の場合
倍する場合、左に ビットシフトさせて、空いたビットに0
を入れればよい。
倍する場合、右に ビットシフトさせて、空いたビットに0
を入れればよい。
- 符号付き整数の場合
倍する場合、左に ビットシフトさせて、空いたビットに0を入れればよい。
倍する場合、右に ビットシフトさせて、空いたビットには符号ビッ
トを入れればよい。
|
CASL IIの整数をビットシフトを用いて2で割ったりすると、端数(小数部)が生じる。この
端数は、16ビットを越えるので、無視される。ここで、商が切り上げなのか切り下げなの
か、疑問が発生する。これについても、実際の整数で考える。
と
を1ビット右にシフトさせて、1/2倍してみる。
この結果から、以下のようにまとめることができる。
ポイント |
---|
- 正の整数の場合、端数は切り下げとなる。
- 負の整数の場合、端数は切り上げとなる。
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成16年10月22日