AVR 循环中的位比较
bit comparison in loop on AVRs
我正在学习 AVR 上 C 语言的位逻辑,但遇到了问题。
我想比较 int8_t 变量的 "i" 位(从右边开始),如果它是 1,则执行下一条指令,但它不起作用。这是我写的:
if (variable & (1<<i)==(1<<i)) instruction;
在以下数据的示例中:
uint8_t dot=0101;
PORTC=1;
for (int i=0; i<4; i++)
{
PORTB = fourDigit[i];
if (dot & (1<<i)==(1<<i)) PORTB--;
PORTC<<=1;
}
点(因为它连接到 PB0)应该在第一和第三位点亮,但目前它点亮在每个数字上。有什么问题?
感谢您的宝贵时间。
这是通过位掩码完成的。如果你想检查 a
的第 i
位是否为 1,你将执行如下操作:
if (a & (1 << i))
{
// Do something
}
这样 a
除了第 i
位之外的所有位都将 AND 与零相结合,从而得到零值.第 i
位将 AND 与 1
运算,因此不会更改其值。因此,如果位不为零,if
条件将为真,否则为假。
您提供的比较代码也应该有效,但我怀疑 dot
变量不包含您认为它包含的值。 uint8_t dot=0101;
使其等于 八进制 基数中的 101
(由于前导零)或十进制中的 65
。不是二进制的 101
。
我正在学习 AVR 上 C 语言的位逻辑,但遇到了问题。
我想比较 int8_t 变量的 "i" 位(从右边开始),如果它是 1,则执行下一条指令,但它不起作用。这是我写的:
if (variable & (1<<i)==(1<<i)) instruction;
在以下数据的示例中:
uint8_t dot=0101;
PORTC=1;
for (int i=0; i<4; i++)
{
PORTB = fourDigit[i];
if (dot & (1<<i)==(1<<i)) PORTB--;
PORTC<<=1;
}
点(因为它连接到 PB0)应该在第一和第三位点亮,但目前它点亮在每个数字上。有什么问题?
感谢您的宝贵时间。
这是通过位掩码完成的。如果你想检查 a
的第 i
位是否为 1,你将执行如下操作:
if (a & (1 << i))
{
// Do something
}
这样 a
除了第 i
位之外的所有位都将 AND 与零相结合,从而得到零值.第 i
位将 AND 与 1
运算,因此不会更改其值。因此,如果位不为零,if
条件将为真,否则为假。
您提供的比较代码也应该有效,但我怀疑 dot
变量不包含您认为它包含的值。 uint8_t dot=0101;
使其等于 八进制 基数中的 101
(由于前导零)或十进制中的 65
。不是二进制的 101
。