带有二元参数的IF条件

时间:2017-08-02 00:50:21

标签: c if-statement binary microchip

很抱歉再次提问......但我似乎很难用二进制... 我偶然发现了以下一行

 MGC_SSPBUF_REG = (GESTIC_I2C_ADDR << 1) | 1; // write Address to MGC3130

除了事实之外,我不知道为什么要将地址向左移动以保存它,我无法理解这个OR操作。

地址与“1”进行对比将始终生成1111 1111,不会吗?

我正在用C语言编写Microchip PIC18F14K50。同时检查写入的代码 另一家公司偶然发现了以下几行:

if(MGC_SSPCON2_REG & 0x1F) { // MSSP not idle
...
}

现在,MGC_SSPCON2_REG实现如下

 #define MGC_SSPCON2_REG         SSPCON2

其中SSPCON是8位MSSP控制寄存器(在I2C模式下)。

我不明白,这个if条件是如何工作的。当8位二进制数的所有位都设置为1时是真的吗? 据我所知,该参数是8位寄存器上的逐位AND运算和二进制数0001 1111(0x1F)。

我希望我提供足够的代码来理解这个问题。我不想详细了解寄存器的工作原理。

提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

如果设置了5个最低有效位中的任何一个(由于按位且为0x1F,它将执行。

答案 1 :(得分:0)

  

地址与&#34; 1&#34;将永远导致1111 1111,不是吗?

不,为什么要全是1?如果OR值为1(即000000..0001),则只设置在ORed值中设置的位,即只有1个最低有效位。

您的地址xyzxyz可能是GESTIC_I2C_ADDR的价值,之后您的结果为xyzxyz1

没有理由也会影响所有其他位。

  

我不明白,这个if条件是如何工作的。当8位二进制数的所有位都设置为1时是真的吗?

嗯,数学上的说法:是的。 ;) 但不是&#34;如果只是和#34;全部5位置位。 如果只设置了其中一个位,也是如此。

  

据我了解,该参数是8位寄存器和二进制数0001 1111(0x1F)的逐位AND运算。

如果您理解这一点,并且您理解了&#34;按位&#34;这一切,那么一切都应该清楚。

我想知道如果你已经理解了这个含义,你是如何理解上述问题的。