組込み・ファームウェア

C言語で、レジスタregのビット3だけを0にし、ほかのビットは変えない書き方として正しいものはどれか。

  1. Areg &= ~(1 << 3);
  2. Breg |= ~(1 << 3);
  3. Creg &= (1 << 3);
答えと解説を見る

正解:A. reg &= ~(1 << 3);

「~(1 << 3)」は、ビット3だけが0で、ほかがすべて1の値です。これとAND(&)を取ると、ビット3は必ず0になり、ほかのビットは1とのANDなので元のまま残ります。ビットを立てるOR、下ろすAND NOT、反転させるXOR(^)、調べるANDの4つは、ファームウェアでレジスタを操作するときの基本の形です。

  • A. 正しい。ビット3だけが0のマスクとANDを取ります。
  • B. ORではビット3以外がすべて1になってしまいます。
  • C. これではビット3以外がすべて0になります。
この分野を解く 分野ページへ

組込み・ファームウェアのほかの問題

  1. LEDをつないだ出力端子のビットを、実行するたびに点灯と消灯で切り替えたい。C言語の書き方として正しいものはどれか。
  2. 入力用のレジスタinのビット5が1かどうかを調べるC言語の条件として正しいものはどれか。
  3. 上のコードは、レジスタregの複数ビットの設定欄を書き換えている。何をしているか。
  4. メイン処理でレジスタのビットを「reg |= mask;」(読み出し・変更・書き込み)で操作している最中に、割り込みハンドラが同じレジスタの別のビットを書き換えると起こりうる問題と対策の組み合わせとして正しいものはどれか。
  5. マイコンの入力端子にスイッチだけをつなぎ、プルアップやプルダウンの抵抗を付けなかった。スイッチが開いているときに起こりうることはどれか。