ビットを反転する | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

ある符号無し整数型の値を構成する複数のビットの中の、任意の位置のビットを、0 だったら 1 に、1 だったら 0 に反転したいとします。

ビット演算は原則的に、符号無し整数型に対して使用します(第49章

ここでいう「任意のビット」は、特定の1つのビットでもいいですし、2ビット以上連続したり、飛び飛びであったりしてもいいものとします。たとえば、

といった具合です。

方法①(ビット単位排他的論理和を使う)

あるビットを反転するには、ビット単位排他的論理和(第49章)を使います。

排他的ビット和は、2つのビットを比較して、いずれか一方が 1 のときにだけ結果が 1 に、それ以外の場合には 0 になります。この性質を利用して、反転したいビットだけを “1” にした整数を用意し(これを BITS とします)、これとターゲットの整数とで排他的ビット和を取れば、ビットの反転が実現できます。

ターゲットの整数 ^= BITS;

実際に試してみます。

#include <stdio.h>

int main(void)
{
    unsigned char n1 = 0xf0;
    unsigned char n2 = 0x80;
    unsigned char n3 = 0x7f;

    // 一番上位のビットを反転する
    printf("%x\n", (n1 ^ 0x80));
    printf("%x\n", (n2 ^ 0x80));
    printf("%x\n", (n3 ^ 0x80));
    puts("----");

    // 下位から数えて、3~7 ビット目の範囲を反転する
    printf("%x\n", (n1 ^ 0x3c));
    printf("%x\n", (n2 ^ 0x3c));
    printf("%x\n", (n3 ^ 0x3c));
    puts("----");

    // 奇数ビットすべてを反転する
    printf("%x\n", (n1 ^ 0x55));
    printf("%x\n", (n2 ^ 0x55));
    printf("%x\n", (n3 ^ 0x55));
    puts("----");
}

実行結果:

70
0
ff
----
cc
bc
43
----
a5
d5
2a
----

桁が多いと分かりづらいので、ここでは unsigned char型を使って、8bit の符号無し整数型で試しています。もっと大きい型を使っても、ビットの数が増えるだけで、やり方はなんら変わりません。

また、結果だけが見たいので、変数の値を書き換えないようにしています。変数の値を変えたいのなら、(n1 ^ 0x7f) であれば n1 ^= 0x7f; のようにすればいいです。


参考リンク


更新履歴



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る