Menu

Category

Archive

logo


C言語でのビットレベルの処理

2014-05-24 16:00:00 +0900
  • このエントリーをはてなブックマークに追加

C でのビット操作に関してのまとめ。基本的な AND, OR, XOR, NOT。そして、ビットシフトの方法に関する記事です。

AND ( & )

AND はバイナリオペレーション。両者とも 1 の場合に結果も 1 になる。

1
2
3
4
5
6
int main (void)
{
    unsigned short a = 12, b = 4, c;
    c = a & b;
    printf("a & b = %d\n", c); // c = 4
}

OR ( | )

OR はどちらかが 1 なら 1。

1
2
3
4
5
6
int main (void)
{
    unsigned short a = 12, b = 4, c;
    c = a | b;
    printf("a | b = %d\n", c); // c = 12
}

XOR ( ^ )

XOR は同じビットは 0、そうでないなら 1。

1
2
3
4
5
6
int main (void)
{
    unsigned short a = 12, b = 4, c;
    c = a ^ b;
    printf("a ^ b = %d\n", c); // c = 8
}

NOT ( ~ )

NOT はビットを反転させる。

1
2
3
4
5
6
int main (void)
{
    unsigned short a = 65534, b;
    b = ~a;
    printf("b = %d\n", b); // b = 1
}

XOR での swap

XOR をオペレーターをしようすれば、余分な変数を使用する必要なく変数の値を交換できます。

1
2
3
4
5
6
7
8
9
10
11
12
int main (void)
{
    int a = 10;
    int b = -10;
    
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    printf("a = %d\n", a); // a = -10
    printf("b = %d\n", b); // b = 10
}

ビットシフト («, »)

ビットシフト操作は基本的に unsigned のデータに使用する。これは、ANSI C が、右シフトの際にゼロをシフトするか、MSBをシフトするかは、コンパイラ次第と規定しているため。unsigned の場合には、いつもゼロがシフトされる。

1
2
3
4
5
6
7
8
9
10
11
int main (void)
{
    unsigned short a = 3, b = 7, c = 32768, d;

    d = a << 3;
    printf("a << 3 = %d\n", d); // d = 24
    d = b >> 2;
    printf("b >> 2 = %d\n", d); // d = 1
    d = c >> 14;
    printf("c >> 14 = %d\n", d); // d = 2
}