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:

main_C said...

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

main_C said...

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

@aka said...

main_C さん、はじめまして。

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

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

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

Post a Comment