<<演算子(左シフト)と>>演算子(右シフト)・ビット単位のシフト演算
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
左シフト
スポンサーリンク
<<演算子は、ビット単位の左シフトを行います。 左側にはみ出したビットは消えてしまい、右側の空いたビットには、0が追加されます。 2進数は、×2で桁上がりしますから、1ビットの左シフト(num << 1)は、2をかけることと同じ、(num << 3)は、8(2の3乗)をかけることと同じです。 右シフト
>>演算子は、ビット単位の右シフトを行います。
右側にはみ出したビットは、消えてしまい、左側の空いたビットには何かがセットされます。
何か、とはオペランドが符号付の場合、符号なしの場合で異なります。
符号付の変数の場合は、符号ビットが使われて、符号なしの変数の場合は、符号ビットが使われます。
以下は、10進数の数字を一つ入力し、左シフト、右シフトを行い、10進数・2進数で、それぞれどうなるかを出力するプログラムです。(正数のみ正常動作します。)
#include <iostream>
int tobinary(int number) {
int bit;
int binary[100];
int count = 0;
while (true) {
bit = number % 2;
number = number / 2;
binary[count] = bit;
if (number == 0) {
break;
}
count++;
}
for (int i = count; i >= 0; i--) {
std::cout << binary[i];
}
return (0);
}
int num;
int main() {
while (true) {
std::cout << "Enter decimal number: ";
std::cin >> num;
std::cout << "decimal " << num << " to binary : ";
tobinary(num); // numを2進数表示
std::cout << "\n";
// 1ビットのシフト演算
int left = (num << 1);
int right = (num >> 1);
std::cout << "Left shift " << num << " << 1 : decimal=" << left << ", binary=";
tobinary(left); // 左シフトを2進数で表示
std::cout << "\n";
std::cout << "Rgiht shift " << num << " >> 1 : decimal=" << right << ", binary=";
tobinary(right); // 右シフトを2進数で表示
std::cout << "\n";
}
return 0;
}
実行結果。
Enter decimal number: 5 decimal 5 to binary : 101 Left shift 5 << 1 : decimal=10, binary=1010 Rgiht shift 5 >> 1 : decimal=2, binary=10 Enter decimal number: 200 decimal 200 to binary : 11001000 Left shift 200 << 1 : decimal=400, binary=110010000 Rgiht shift 200 >> 1 : decimal=100, binary=1100100 Enter decimal number:
左シフトでは、2進数で桁が一つ繰り上がり、10進数で「×2」が行われていることが確認できます。
右シフトでは、2進数で桁が一つ繰り下がり、10進数で「÷2」の余り切捨てが行われていることを確認できます。
スポンサーリンク
<< 前の記事 : &演算子・ビット単位の論理積演算/10進数を2進数に変換しビット論理積を求める
スポンサーリンク