メモ帳を見直していたら、ビット反転のメモを見つけたので転載。
変数 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
トグルは、
ReplyDeletereg ^= foo;
でいけますよ。
reg |= ~reg & foo;
ReplyDeleteのコードでは、トグルにはなりません。
0が1になりますが、1が0になりません。
main_C さん、はじめまして。
ReplyDeleteこんな古い記事を見つけて下さり、ありがとうございます。
おまけに大きなバグまで指摘していただいちゃって m(_ _)m
ご指摘のコードは、^ を使うように書き直しました。
本当。ありがとうございます。