很抱歉再次提问......但我似乎很难用二进制... 我偶然发现了以下一行
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)。
我希望我提供足够的代码来理解这个问题。我不想详细了解寄存器的工作原理。
提前感谢您的帮助:)
答案 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;这一切,那么一切都应该清楚。
我想知道如果你已经理解了这个含义,你是如何理解上述问题的。