<<演算子(左シフト)と>>演算子(右シフト)・ビット単位のシフト演算

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
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」の余り切捨てが行われていることを確認できます。

スポンサーリンク
 
スポンサーリンク