[c言語] さっと復習(10) ビット演算

ビット演算(ビットえんざん、bitwise operation: 直訳すると「ビット毎操作」)とは、固定長のワードなどといった「ビットのカタマリ」(コンピュータの数値表現なども参照)に対して、各々のビット全てに対する論理演算をいっぺんに行う演算操作である。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

2進数での表示

c言語では、簡単にビット表示する方法が用意されていないそうなので、まずビット表示する関数を作成する。

#include <stdio.h>

void print_binary(int num);

int main(void) {
    int x;

    printf("Please input a positive integer, the maximum is 255: ");
    scanf("%d", &x);
    print_binary(x);

    return 0;
}

void print_binary(int num) {
    int len = 8;
    int bit[len];
    int x;

    for (int i=0; i<len; i++) {
        x = 1 << i;
        x = num & x;
        bit[len-i-1] = x >> i;
    }

    printf("0b");
    for (int i=0; i<len; i++) {
        printf("%d", bit[i]);
    }
    printf("\n");
}

ビット演算子

基本的なビット演算を行ってみる。

#include <stdio.h>

void print_binary(int num);

int main(void) {
    int x;
    int num = 0x0f;
    int num_2 = 0xff;
    printf("num: ");
    print_binary(num);
    printf("num_2: ");
    print_binary(num_2);

    // 左シフト
    x = num << 1;
    printf("num << 1: ");
    print_binary(x);

    // 右シフト
    x = num >> 1;
    printf("num >> 1: ");
    print_binary(x);

    // AND
    x = num & num_2;
    printf("num & num_2: ");
    print_binary(x);

    // OR
    x = num | num_2;
    printf("num | num_2: ");
    print_binary(x);

    // XOR
    x = num ^ num_2;
    printf("num ^ num_2: ");
    print_binary(x);
    
    // NOT
    x = ~num;
    printf("~num: ");
    print_binary(x);

    return 0;
}


void print_binary(int num) {
    int len = 8;
    int bit[len];
    int x;

    for (int i=0; i<len; i++) {
        x = 1 << i;
        x = num & x;
        bit[len-i-1] = x >> i;
    }

    printf("0b");
    for (int i=0; i<len; i++) {
        printf("%d", bit[i]);
    }
    printf("\n");
}