嵌入式與韌體
上面的程式碼正在改寫暫存器reg中多位元的設定欄位。它做了什麼?
reg = (reg & ~(0x7 << 4)) | (5 << 4);
- A只將位元5設為1
- B先將位元4~6這3位元的欄位清為0,再把5(二進位為101)填入該處
- C將reg的值乘以5後再向左移4位元
查看答案與解析
正確答案:B. 先將位元4~6這3位元的欄位清為0,再把5(二進位為101)填入該處
0x7以二進位表示為111,因此「0x7 << 4」是位元4~6為1的遮罩。取其反相並做AND運算來清除欄位,再與「5 << 4」(位元4~6為101)做OR運算,就只有該欄位變成5,其他位元維持原值。這是改寫以多個位元表示一項設定(例如動作模式或除頻比)的暫存器時的基本形式。
- A. 這是同時設定多個位元。
- B. 正確。先清除欄位再填入新值。
- C. 這不是乘法,而是位元操作。