ビット演算


C言語は「高級アセンブラ」とも呼ばれるように、CPUが内部で持っている 機能をそのままサポートしている。

a & b
a | b
a ^ b
~a
a << n
a >> n

のような演算子がある。上から、論理積、論理和、排他的論理和、否定、 左シフト、右シフトである。あまり使うことは無い。次の実行例で 理解して欲しい。

#include <stdio.h>

void bitprint(unsigned int a)
{
    int i;

    char buf[sizeof(int)*8];

    for (i=0; i<sizeof(int)*8; i++) {
        if ((a & 1) == 0) buf[i] = '0';
        else buf[i] = '1';
        a >>= 1;
        
    }
    for (i=sizeof(int)*8-1; i>=0; i--) {
        printf("%c", buf[i]);
    }
    printf("\n");
}

main()
{
    bitprint(5);
    bitprint(6);
    bitprint(6 & 5);
    bitprint(6 | 5);
    bitprint(6 ^ 5);
    bitprint(~5);
    bitprint(5 >> 1);
    bitprint(5 >> 2);
    bitprint(5 << 1);
    bitprint(5 << 2);

    return 0;
}
bit.c

00000000000000000000000000000101
00000000000000000000000000000110
00000000000000000000000000000100
00000000000000000000000000000111
00000000000000000000000000000011
11111111111111111111111111111010
00000000000000000000000000000010
00000000000000000000000000000001
00000000000000000000000000001010
00000000000000000000000000010100

真理値表

a b a & b
0 0 0
0 1 0
1 0 0
1 1 1
論理積 (and)

a b a | b
0 0 0
0 1 1
1 0 1
1 1 1
論理和 (or)

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0
排他的論理和 (xor, exclusive or)

a ~ a
0 1
1 0
否定 (not)


ビット演算