<<演算子(左シフト)と>>演算子(右シフト)・ビット単位のシフト演算
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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進数に変換しビット論理積を求める
スポンサーリンク