2.9 ビットごとの論理演算子 K&R プログラミング言語C

& (AND)
共に 1 の場合 1
どちらか一方、または両方が 0 の場合 0
| (OR)
共に 0 の場合 0
どちらか一方、または両方が 1 の場合 1
^ (XOR)
共に同じ値の場合 0
異なる値の場合 1
<< (Left Shift)
各ビットを左に指定したビット数だけ移動
右のはみ出したビットは 0 になる
>> (Right Shift)
各ビットを右に指定したビット数だけ移動
左のはみ出したビットは 0 になる
~ (NOT)
0 の場合 1
1 の場合 0
#include <stdio.h>

int main(int argc, char *argv[])
{
    unsigned char i, j;

    i = 89;     /* 89  => 0101 1001 */
    j = 205;    /* 205 => 1100 1101 */

    printf("89 & 205 => %u\n", i & j); /* 73  => 0100 1001 */
    printf("89 | 205 => %u\n", i | j); /* 221 => 1101 1101 */
    printf("89 ^ 205 => %u\n", i ^ j); /* 148 => 1001 0100 */
    printf("89 >> 1 => %u\n", i >> 1); /* 44  => 0010 1100 */
    printf("89 << 1 => %u\n", i << 1); /* 178 => 1011 0010 */
    printf("~89 => %u\n", ~i);         /* 4294967206 => 1010 0110 */

    return 0;
}

実行結果

$ ./bit_test
89 & 205 => 73
89 | 205 => 221
89 ^ 205 => 148
89 >> 1 => 44
89 << 1 => 178
~89 => 4294967206

getbits について

getbits の動作図

#include <stdio.h>

unsigned getbits(unsigned x, int p, int n);

int main(int argc, char *argv[])
{
    int i;

    i = 12;
    printf("%u\n", getbits(i, 4, 3));

    return 0;
}

/* getbits : p の位置から n ビットを取ってくる */
unsigned getbits(unsigned x, int p, int n)
{
    return (x >> (p+1-n)) & ~(~0 << n);
}

実行結果

$ ./getbits
3

参考:ビット演算スクリプト

プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»