2008-11-21

任意のビットのビット反転

メモ帳を見直していたら、ビット反転のメモを見つけたので転載。

変数 reg は任意のビット列。変数 foo で変数 reg のビットを ON にしたり OFF にしたり、ビットを反転させたりする。

{
  int reg = 0xXXXIXXXX;
  int foo = 0x00010000;

  reg |= foo;        /* foo のビットを強制 ON (1 にする)*/
  reg &= ~foo;       /* foo のビットを強制 OFF (0 にする) */
  reg ^= foo;        /* foo のビットをトグル (1 なら 0 に、0 なら 1 にする) */
}

main_C さんに、下のコードは間置っていると教えていただきました。main_C さん、ありがとうございます

トグルするコードは、予めマクロにしておく方が良いかも。

#define TOGGLE_BIT(a,b)  a |= ~a & b

3 comments:

  1. トグルは、
    reg ^= foo;
    でいけますよ。

    ReplyDelete
  2. reg |= ~reg & foo;
    のコードでは、トグルにはなりません。
    0が1になりますが、1が0になりません。

    ReplyDelete
  3. main_C さん、はじめまして。

    こんな古い記事を見つけて下さり、ありがとうございます。
    おまけに大きなバグまで指摘していただいちゃって m(_ _)m

    ご指摘のコードは、^ を使うように書き直しました。

    本当。ありがとうございます。

    ReplyDelete