在C单片机中设置位

时间:2014-03-16 05:41:55

标签: c variable-assignment microcontroller bit

我正在尝试学习如何用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分配给该表达式的结果?

我是否理解正确

4 个答案:

答案 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);