10進数を10倍、100倍、1000倍、
![$ \cdots$](img3.png)
するのは簡単である。
![$ 10^{n}$](img4.png)
倍するためには、
左にゼロを
![$ n$](img5.png)
個付ければ良い。これは、左シフトである。同様に
![$ 1/10$](img6.png)
倍、
![$ 1/100$](img7.png)
倍、
![$ 1/1000$](img8.png)
倍、
![$ \cdots$](img3.png)
するのは簡単である。
![$ 10^{-n}$](img9.png)
倍するためには、小数点の位置を
![$ n$](img5.png)
個左に寄せれば良い。これは右シフトである。
16進数の場合も同じである。たとえば、
を
倍や
倍、
倍や
倍すると
となる。やはり、右や左にシフトさせれば良い。
2進数の場合も全く同じである。この場合、
の計算が簡単である。
が正の整数
の場合、左に
ビットシフトさせる。一方、
が負の整数の場合、
の絶対値分、右
にシフトさせる。
CASL IIで取り扱う16ビットの整数を
![$ 2^n$](img1.png)
倍する事を考える。もし、その16ビットが正
で有れば、それは簡単である。先に示したように、
![$ n$](img5.png)
ビット右や左にシフトさせれば良
い。
問題は、符号付き整数で、第15ビットが1の負の場合である。これは、実例を示した方が
分かりやすい。たとえば、
を2倍と4倍する事を考える。2倍すると
で、4倍すると
である。それぞれを、2の補数で取り扱うと、
となる。
従って、CASL IIの符号付き16ビット整数の場合、
![$ 2^n$](img1.png)
する場合は、左に
![$ n$](img5.png)
ビットシフ
トさせて、空いたビットに0を入れれば良い。
次に、1/2倍と1/4倍する事を考える。すると
となる。この場合も右に
![$ n$](img5.png)
ビットシフトさせれば良いのであるが、空いたビットには1を
入れなくてはならない。
ポイント |
---|
- 符号無し整数の場合
倍する場合、左に ビットシフトさせて、空いたビットに0
を入れればよい。
倍する場合、右に ビットシフトさせて、空いたビットに0
を入れればよい。
- 符号付き整数の場合
倍する場合、左に ビットシフトさせて、空いたビットに0を入れればよい。
倍する場合、右に ビットシフトさせて、空いたビットには符号ビッ
トを入れればよい。
|
CASL IIの整数をビットシフトを用いて2で割ったりすると、端数(小数部)が生じる。この
端数は、16ビットを越えるので、無視される。ここで、商が切り上げなのか切り下げなの
か、疑問が発生する。これについても、実際の整数で考える。
と
を1ビット右にシフトさせて、1/2倍してみる。
この結果から、以下のようにまとめることができる。
ポイント |
---|
- 正の整数の場合、端数は切り下げとなる。
- 負の整数の場合、端数は切り上げとなる。
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成16年10月22日