【问题标题】:bit comparison in loop on AVRsAVR 循环中的位比较
【发布时间】:2015-05-27 21:05:48
【问题描述】:

我正在 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)应该在第一个和第三个数字上亮起,但目前它在每个数字上都亮起。有什么问题?

感谢您的宝贵时间。

【问题讨论】:

    标签: c bit avr led operations


    【解决方案1】:

    这是通过位掩码完成的。如果您想检查a 的第i'位是否为1,您将执行以下操作:

    if (a & (1 << i))
    {
        // Do something
    }
    

    这样a 的所有位,除了i'第一个将与零AND,从而得到零值。 i'th 位将与1 进行AND运算,因此不会改变它的值。因此,if 条件将在位不为零的情况下为真,否则为假。
    您提供的比较代码也应该可以工作,但我怀疑 dot 变量不包含您认为它包含的值。 uint8_t dot=0101; 使其等于 八进制 基数的 101(由于前导零)或十进制的 65。不是二进制的101

    【讨论】:

    • 我已经复制了你的代码,它可以工作。我的应该也可以,但没有。至于 uin8_t dot 里面的数字,我用的是二进制(0b0101)。谢谢
    • 是的。优先级是这里的情况。您应该将== 运算符的左侧部分括在括号中。
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多