thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

ビットシフト

名前のとおりビット単位で全bitをシフトします。右(小さく)へシフトさせる場合に[>>]を、左(大きく)へシフトさせる場合には[<<]を指定します。
ビット幅を超えたbitはなくなります。逆に出現したら(逆側から出てきたbit)0です。

#include <stdio.h>

void _print(unsigned char val) {
  unsigned char msk = 128; // 10000000
  for( ; msk; msk >>= 1) {
    if ( val & msk )  putchar('1');
    else          putchar('0');
  }
}

int main() {
    unsigned short i=1;

    i = 3;
    printf("%2d:",i);_print(i);printf("\n");

    // 左へ1bitシフト
    i <<= 1;
    printf("%2d:",i);_print(i);printf("\n");

    // 左へ1bitシフト
    i <<= 1;
    printf("%2d:",i);_print(i);printf("\n");

    // 右へ2bitシフト
    i >>= 2;
    printf("%2d:",i);_print(i);printf("\n");

    // シフトして1が1つ消えます。
    i >>= 1;
    printf("%2d:",i);_print(i);printf("\n");

    // シフトして全部消えます。
    i >>= 1;
    printf("%2d:",i);_print(i);printf("\n");

    // 0からシフトしても0が出てくるだけで、0です
    i <<= 1;
    printf("%2d:",i);_print(i);printf("\n");
}


結果

$ gcc main.c
$ ./a.out
 3:00000011
 6:00000110
12:00001100
 3:00000011
 1:00000001
 0:00000000
 0:00000000