如何解决按位操作-清除一位
我正在对Arduino中的计时器控制寄存器进行一些按位操作,我注意到当我想清除寄存器TCCR1B中的CS11位时,
TCCR1B &= (0<<CS11)
将无法正常工作,但以下情况可以正常工作
TCCR1B &= ~(1<<CS11)
为什么第一个(0
解决方法
(0<<CS11)
的值为0
(因为将其所有位均为零的整数进行移位也会产生零),因此TCCR1B &= (0<<CS11)
将TCCR1B
的值设为零。 (除非寄存器的某些位不可写)
另一方面,(1<<CS11)
将是一个整数,其位为1,其他位为零(除非CS11
太大或为负数),而~(1<<CS11)
将为一个整数,其位为零,其他位为一。因此TCCR1B &= ~(1<<CS11)
将清除一位,而其他位保持不变。 (除非写入寄存器的位具有特殊含义)
这个简短的程序(您可以编写该程序以查看发生了什么)应该解释发生了什么。
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <limits.h>
void printbin(unsigned x)
{
unsigned mask = 1 << (CHAR_BIT * sizeof(mask) - 1);
for(;mask; mask >>= 1)
{
printf("%c",x & mask ? '1' : '0');
}
printf("\n");
}
int main(void)
{
unsigned x = ~0;
unsigned mask;
mask = 0 << 5;
printbin(x);
printbin(mask);
printbin(x & mask);
printf("\n");
mask = 1 << 5;
printbin(x);
printbin(mask);
printbin(x & ~mask);
}
和结果:
11111111111111111111111111111111
00000000000000000000000000000000
00000000000000000000000000000000
11111111111111111111111111111111
00000000000000000000000000100000
11111111111111111111111111011111
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。