変数の特定ビットだけを0に落とす時に、条件式を簡単に書く

※本記事の例はC言語ですが、java,C#などのビット操作が出来る言語に共通した話です。

まずは、ビット操作の基本的な考え方です。
たとえばcharがたの変数dataから、5bit目だけ0に落としたい場合を考えます。

この場合のコードをシンプルに書くと、以下のようになります

char data = xxx;
char ans  = data & 0xDF;



これは、以下の論理式演算(ビット単位のand)を行って、特定ビットを落としています。

        (data)  xxxx xxxx
and     (0xdf)  1101 1111
--------------------------
                xx0x xxxx



というわけで、落としたいビット以外が1になった値と”&”を取ればOKです。



..ですが、5bit目を落とすために書いた値が0xdfというのは、直観的にわかりづらく、可読性に劣ります

このような場合は、ビット単位の否定演算子である”~”と組み合わせて書くと分かり易いです。

char data = xxx;
char ans  = data & ~(0x20);	/* 5bit目だけを落とす */



0x20であれば、5bit目だけが1であることが直ぐにわかるので見やすいです。


逆に特定ビットだけを立てたい時はというと、これはビット単位でorを取ればよいだけなので特に問題ないです。

char data = xxx;
char ans  = data | 0x20;	/* 5bit目だけを立てる */






–補足–
通常のアプリの場合はこれでおしまいですが、マイコンの場合は例外的な場合もあります。
マイコンの場合は、I/Oのアクセスがメモリ空間に割り当てられている、メモリマップドIOになっている場合が多いです。

この場合、I/Oを操作するメモリは、一部Write Onlyになっている場合があります。

たとえばH8マイコンではポート入出力を指定するI/OにPCRレジスタというものがあります。このレジスタのアクセスは”W”(書き込みのみ)という仕様であることが明記されています。


このような場合は、すべてのビットを明示的に指定する必要があります(他のビットは現状維持としたい場合は、前に値をセットした際に、その値を別の変数などで覚えておきます)。

関連記事

コメントを残す

メールアドレスが公開されることはありません。