組込み・ファームウェア
上のコードは、レジスタregの複数ビットの設定欄を書き換えている。何をしているか。
reg = (reg & ~(0x7 << 4)) | (5 << 4);
- Aビット5だけを1にする
- Bビット4〜6の3ビットの欄を0にしてから、そこに5(2進数で101)を入れる
- Cregの値を5倍してから4ビット左にずらす
答えと解説を見る
正解:B. ビット4〜6の3ビットの欄を0にしてから、そこに5(2進数で101)を入れる
0x7は2進数で111なので、「0x7 << 4」はビット4〜6が1のマスクです。その否定とANDを取って欄を0にし、「5 << 4」(ビット4〜6に101)とORを取ると、欄だけが5に変わり、ほかのビットは元のまま残ります。動作モードや分周比のように、複数ビットで1つの設定を表すレジスタを書き換えるときの基本の形です。
- A. 複数のビットを同時に設定しています。
- B. 正しい。欄を消してから新しい値を入れます。
- C. 掛け算ではなく、ビットの操作です。