全面说明按位清除位

时间:2018-07-31 18:19:49

标签: bit-manipulation bitwise-operators bit-shift

我一直在尝试清除位的逻辑,但我不太了解。这是我到目前为止的内容,其中TIMSK0是寄存器,TO1E0TIMSK0内的最低有效位

TIMSK0 &= ~(1<<TO1E0)

因此,我一直在逻辑上进行思考,并试图理解而不是记忆。上面的完整符号示例为:

TIMSK0 = TIMSK0 & ~(1<<TO1E0)

假设TIMSK0当前为0000 0001,则意味着TO1E0 = 1 那么该参数看起来像~(1<<1),这意味着将1向左移1,结果为0。但是然后 not of 0 为1,所以我将寄存器TIMSK0与1

0000 0001 & 1

这也会产生相同的值0000 0001,我非常确定自己在逻辑中被弄乱了。

2 个答案:

答案 0 :(得分:0)

让我们谈谈表达

x &= ~(1 << n)

它如何工作?假设 n = 4 x = 19 。然后发生了什么:

(1 << n)
0000 0001 //is a binary representation of 1
(1 << 4) = 0001 0000 = 16//shifted by n=4 bits

~(1 << n)
~(0001 0000) = 1110 1111 //as ~ inverts every bit

x &= ~(1 << n)
0001 0011 //is a binary representation of 19
0001 0011 & 1110 1111 = 0000 0011 = 3 //as & is implemented bit by bit

So result is 0000 0011 with cleared 4th bit compared to source 0001 0011

这使用更简单的规则(现在谈论比特)x&1 = x,x&0 = 0

答案 1 :(得分:0)

您在此步骤上不正确

  

〜(1 << 1)表示将1左移1,结果为0?

1 << 1的结果为2。因此基本上TIMSK0 &= ~(1<<TO1E0)将清除位数TO1E0

  • 当TO1E0 = 0,1 << TO1E0 = 1~(1 << TO1E0) = ~1 = 0b111...1110时,该表达式将清除最低有效位
  • 当TO1E0 = 1,1 << TO1E0 = 2~(1 << TO1E0) = ~2 = 0b111...1101时,该表达式将清除第二个有效位

结果是,TIMSK0 = 0000 0001TO1E0 = 1之后的TIMSK0不会在语句后更改,因为它的第二个有效位已经为零

请参见How do you set, clear, and toggle a single bit?