1.5 左シフト演算子と右シフト演算子 左シフト演算子 (<<) は、指定したビット数だけデータのビットを左にシフト(ず らす)します。左側にはみ出したビットは削除されます。右側の空いたビットには0 が詰められます。 右シフト演算子 (>>) は、右側へ指定ビットだけシフトします。しかし左シフト演 算子とは違って、右シフト演算子は空いた左側のビットに何を詰めるかはマシンによ って違います。 ここで示す例では、符号付きの変数に対しては、符号ビット(正が0、負が1)が 使用されます。符号なしの変数では、0を詰めるようになっています。 演算 c << 3 は、cのビットが左へ3ビットシフトします。同様に演算 c >> 2 は右へ2ビットシフトします。注意すべきことは、変数cの値が変わるのではありま せん。式 (c << 3) が演算結果の値を持つのです。 次のプログラムは、シフト演算子の様子を示すものです。
// list01_07.cpp
// 左シフト演算子(<<)と右シフト演算子(>>)
#include <iostream.h>
//10進数を2進数に変換してプリントする
void dec2bin(int dec)
{
// dec2bin.cpp と同じ関数
}
int main()
{
int x, i;
cout << "整数を入力してください: x = ";
cin >> x;
cout << " x = ";
dec2bin(x);
// 左シフト演算
cout << "\n左シフトするビット数を入力してください: i = ";
cin >> i;
cout << "x << i = ";
dec2bin( x << i );
// 右シフト演算
cout << "\n右シフトするビット数を入力してください: i = ";
cin >> i;
cout << "x >> i = ";
dec2bin( x >> i );
return 0;
} |
[実行結果]
C:\Source>lst01_07
整数を入力してください: x = 124
x = 00000000 00000000 00000000 01111100
左シフトするビット数を入力してください: i = 3
x << i = 00000000 00000000 00000011 11100000
右シフトするビット数を入力してください: i = 4
x >> i = 00000000 00000000 00000000 00000111
C:\Source>lst01_07
整数を入力してください: x = -124
x = 11111111 11111111 11111111 10000100
左シフトするビット数を入力してください: i = 3
x << i = 11111111 11111111 11111100 00100000
右シフトするビット数を入力してください: i = 2
x >> i = 11111111 11111111 11111111 11100001 |
//10進数を2進数に変換してプリントする
void dec2bin(int dec)
{
int size = sizeof(int)*8;
for(int i= size -1; i >= 0; i--){
if( (dec >> i ) & 1 )
cout << '1';
else
cout << '0';
if( i % 8 == 0 ) cout << " "; // 1バイトごとに空白で区切る
}
cout << endl; // 最後に改行
} |
Copyright(c) 1998,1999 Yamada, K