第40章 ビット演算子  


今回は、少し理屈っぽいです。ビット演算子(bitwize operator)についてします。 その前に、ビットについて少し解説します。もともと、コンピュータの 内部では、2進法で計算が行われます。2進法といえば0と1しかない 世界です。この1桁が1ビットです。 たとえば、int型が2バイトとすればこれは、16ビットです。 10進数の1を表すには、

0000000000000001

となります。これを1桁(1ビット)左に移動して、 桁からあふれた分を赤字で示します。また、右端には 0を詰めます。

00000000000000010

桁あふれした分を無視すると

0000000000000010

となります。これは、10進法で考えるといくつになるでしょう? そうです、2ですね。では、最初の1を2ビット左に移動すると いくつになるでしょう。

0000000000000100

これは、10進数で4ですね。要するに、1ビット左に移動 する事により2倍、2倍とどこかの布団の宣伝みたいになっていきます。 このように、ビットを移動させる演算子をシフト演算子といいます。 左にシフトさせるのは「<<」右にシフトさせるのは「>>」を 使います。

A << B;

のように使います。 AやBは整数でなくてはいけません。Bはint型に変換されます。 Bが負の数であったり、Aの桁数以上の数である場合計算結果はどうなるかわかりません。

このプログラムの説明は、不要ですね。

はい、結果はこの通りです。

次に、Aが負の数であったらどうなるか?を考えてみましょう。 その前に、符号付き2進数の説明をしましょう。 (あまり正確ではない表現です) 超初心者の方は、意外にこれを知らない人が多いようです。 2バイトでは説明が面倒なのでchar型(1バイト)で説明します。 説明というより、例を表示した方が早いでしょう。 見やすいように4ビットと5ビット目にスペースを入れてみました。

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のものは みんなマイナスです。 これを符号ビットということもあります。 また、処理系によっては -128を表現できないものもあるらしいですが 筆者は知りません。

このプログラムも説明不要ですね。

結果は、最初のプログラムにマイナスをつけただけですね。

次に、右シフトですが同じようなもんです。1ビット 右にシフトするごとに2分の1になります。 しかし、注意点があります。Aが、int型である場合 シフトするビットだけ左から符号ビットが詰めていかれます。 unsigned型なら左から0が詰められます。 int型で−1ならばすべてのビットが1で埋められていますので いくら右シフトしても結果は−1です。

-32768はint型が2バイトとしたときの もっとも小さい数。

15ビット以上右シフトしても-1のままです。

「ビット演算子の使い方はわかったが、一体 こんなものどーいう時使うの?」と言いたげですね。 いろいろ使い道はあります。また、どこかの章で 具体的な使い道について考えてみましょう。 また、ビット演算子はシフト演算子だけではなく ほかにもたくさんあります。 少しずつやっていきましょう。 (意味ありげな終わり方です。)


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Dec/07/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。