我一直在尝试清除位的逻辑,但我不太了解。这是我到目前为止的内容,其中TIMSK0
是寄存器,TO1E0
是TIMSK0
内的最低有效位
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
,我非常确定自己在逻辑中被弄乱了。
答案 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
1 << TO1E0 = 1
和~(1 << TO1E0) = ~1 = 0b111...1110
时,该表达式将清除最低有效位1 << TO1E0 = 2
和~(1 << TO1E0) = ~2 = 0b111...1101
时,该表达式将清除第二个有效位结果是,TIMSK0 = 0000 0001
和TO1E0 = 1
之后的TIMSK0
不会在语句后更改,因为它的第二个有效位已经为零