【C言語】
ビット演算子の基本的な使い方
~特定のビットを立てる~

■この記事の概要

この記事では、
C言語のビット演算を使って、
ビットを「立てる」 (x |= (1<<bit))、
ビットを「下げる」 (x &= ~(1<<bit)) 方法を説明しています。

さらに、
効果のないデッドコード (x |= (0<<bit)) に関する注意点についても解説しています。


■特定のビットを1にする(立てる)

#include    <stdio.h>
#include    <stdint.h>
uint32_t bit_on(uint32_t x,int bit) {
    x |= (1<<bit);//特定のビットを立てる  
    return  x;
}
int main(void){
    uint32_t x = 0b0000;
    printf("%x\n",x=bit_on(x,0));//0b0001=1
    printf("%x\n",x=bit_on(x,1));//0b0011=3
    printf("%x\n",x=bit_on(x,2));//0b0111=7
    printf("%x\n",x=bit_on(x,3));//0b1111=F
}
./a.out
1
3
7
f

ビットを立てるには
x |= (1<<bit)
とします。


■特定のビットを0にする(下げる)

#include    <stdio.h>
#include    <stdint.h>
uint32_t bit_off(uint32_t x,int bit) {
    x &= ~(1<<bit);//特定のビットを下げる
    return  x;
}
int main(void){
    uint32_t y = 0b1111;;
    printf("%x\n",y=bit_off(y,3));//0b0111=7
    printf("%x\n",y=bit_off(y,2));//0b0011=3
    printf("%x\n",y=bit_off(y,1));//0b0001=1
    printf("%x\n",y=bit_off(y,0));//0b0000=0
}
./a.out
7
3
1
0

ビットを下げるには
x &= ~(1<<bit)
とします
チルダ~を使うのがミソです。


■紛らわしい何もしないデッドコード

uint32_t bit_do_nothing(uint32_t x,int bit) {
    x |= (0<<bit);//デッドコード
    return  x;
}

x |= (0<<bit);
bitは立も下がりもしないので
デッドコード(何もしないコード)と
なります。

”I have no money”と同じ発想で
”0を立てる”
コーディングする人も多いのですが、
bitの下げ方を知らない初級者も多いので
デッドコードは避けたほうが良いでしょう。


参考:

INT17-C. 処理系に依存しない方法で整数定数を定義する