※本記事の例は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”(書き込みのみ)という仕様であることが明記されています。

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