となります。これを1桁(1ビット)左に移動して、 桁からあふれた分を赤字で示します。また、右端には 0を詰めます。0000000000000001
桁あふれした分を無視すると00000000000000010
となります。これは、10進法で考えるといくつになるでしょう? そうです、2ですね。では、最初の1を2ビット左に移動すると いくつになるでしょう。0000000000000010
これは、10進数で4ですね。要するに、1ビット左に移動 する事により2倍、2倍とどこかの布団の宣伝みたいになっていきます。 このように、ビットを移動させる演算子をシフト演算子といいます。 左にシフトさせるのは「<<」右にシフトさせるのは「>>」を 使います。0000000000000100
A << B;
のように使います。
AやBは整数でなくてはいけません。Bはint型に変換されます。
Bが負の数であったり、Aの桁数以上の数である場合計算結果はどうなるかわかりません。
このプログラムの説明は、不要ですね。
はい、結果はこの通りです。
次に、Aが負の数であったらどうなるか?を考えてみましょう。 その前に、符号付き2進数の説明をしましょう。 (あまり正確ではない表現です) 超初心者の方は、意外にこれを知らない人が多いようです。 2バイトでは説明が面倒なのでchar型(1バイト)で説明します。 説明というより、例を表示した方が早いでしょう。 見やすいように4ビットと5ビット目にスペースを入れてみました。
折り返し点で符号がマイナスになります。 よく見ると一番左のビットが1のものは みんなマイナスです。 これを符号ビットということもあります。 また、処理系によっては -128を表現できないものもあるらしいですが 筆者は知りません。0000 0000......0 0000 0001......1 0000 0010......2 0000 0011......3 0000 0100......4 0000 0101......5 0000 0110......6 0000 0111......7 0000 1000......8 .... .... 0111 1110......126 0111 1111......127 1000 0000......-128 1000 0001......-127 1000 0010......-126 .... .... 1111 1110......-2 1111 1111......-1
このプログラムも説明不要ですね。
結果は、最初のプログラムにマイナスをつけただけですね。
次に、右シフトですが同じようなもんです。1ビット
右にシフトするごとに2分の1になります。
しかし、注意点があります。Aが、int型である場合
シフトするビットだけ左から符号ビットが詰めていかれます。
unsigned型なら左から0が詰められます。
int型で−1ならばすべてのビットが1で埋められていますので
いくら右シフトしても結果は−1です。
-32768はint型が2バイトとしたときの
もっとも小さい数。
15ビット以上右シフトしても-1のままです。
「ビット演算子の使い方はわかったが、一体
こんなものどーいう時使うの?」と言いたげですね。
いろいろ使い道はあります。また、どこかの章で
具体的な使い道について考えてみましょう。
また、ビット演算子はシフト演算子だけではなく
ほかにもたくさんあります。
少しずつやっていきましょう。
(意味ありげな終わり方です。)
Update Dec/07/1996 By Y.Kumei