我正在尝试学习如何用C编程微控制器,并对位分配有疑问。比方说我要声明一个8位数字。
binary_number = 0b00000000;
现在,我想说我只想设置第3位。我见过的示例文本使用如下操作:
binary_number |= (1<<4)
我是否理解正确?我们正在使用binary_number和'or-ing'
,基本上是0b00001000
,然后将结果分配给binary_number?
同样,重置此位时:
binary_number &= ~(1<<4)
我们基本上将binary_number(0b00001000
)和'and-ing'
与0b11110111
一起使用,然后将binary_number
分配给该表达式的结果?
我是否理解正确?
答案 0 :(得分:3)
是的,您的理解是正确的! :) 但是有点变化......
要重置或设置位3,您只需要将1档移位3位
1&lt;&lt;&lt;&lt; 4:0b00010000
1&lt;&lt;&lt;&lt; 3:0b00001000
使用按位OR运算符(|)设置第x位。
n | = 1&lt;&lt; X;
这将设置位x。
使用按位AND运算符(&amp;)重置第x位。
n&amp; =〜(1 <&lt; x);
这将重置位x。
答案 1 :(得分:0)
是的,你正确理解它。这正是您设置和取消设置位所必须做的。看起来很复杂,我知道,但你总是可以编写一个辅助功能,随身携带。
答案 2 :(得分:0)
正如其他人指出的那样,您设置/重置4th
位而不是3rd
Set mask: 1<<4 = 10000 = 0001 0000
Reset Mask: ~(1<<4) = ~(10000)= ~(0001 0000) = 1110 1111
所以,binary_number |= (1<<4)
:
Original Number - 0000 0000
Mask to set 4th bit - (OR) 0001 0000
--------
Result 0001 0000 //4th bit set
而且,binary_number &= ~(1<<4)
:
Original Number - 000X 0000 //4th bit could be a 1 or a 0; X =1/0
Mask to set 3rd bit - (AND) 1110 1111
--------
Result 0000 0000 //4th bit reset
答案 3 :(得分:0)
如果您寻求效率,最好的方法是单独定义位:
#define BIT_0 0b00000001
#define BIT_1 0b00000010
#define BIT_2 0b00000100
#define BIT_3 0b00001000
#define BIT_4 0b00010000
#define BIT_5 0b00100000
#define BIT_6 0b01000000
#define BIT_7 0b10000000
然后将该位设置为一个字节:
unsigned char byteWhoseBitsAreSetReset = 0;
//To Set bit 3
byteWhoseBitsAreSetReset |= BIT_3;
//To Set Multiple bits
byteWhoseBitsAreSetReset |= (BIT_3 + BIT_4 + BIT_5);
//OR
byteWhoseBitsAreSetReset |= (BIT_3 | BIT_4 | BIT_5);
//To reset bit 3
byteWhoseBitsAreSetReset &= ~(BIT_3);
//To reset Multiple bits
byteWhoseBitsAreSetReset &= ~(BIT_3 + BIT_4 + BIT_5);
//OR
byteWhoseBitsAreSetReset &= ~(BIT_3 | BIT_4 | BIT_5);