2017-08-02 90 views
-1

不好意思再问......但我似乎二进制奋斗...... 我偶然发现了以下行如果与二进制参数条件

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

除了一个事实,即不`吨知道,为什么一个人会将地址转移到左边以便保存它,但我无法理解这个OR操作。

将地址ORed加“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位寄存器和二进制数0001 1111(0x1F)上的位操作。

我希望我提供了足够的代码来理解问题。我并不想详细了解登记工作的细节。

预先感谢您的帮助:)

回答

2

如果有5个最低显著位的设置(因为按位与0x1F的,并且它将执行。

+0

非常感谢您的澄清:) – user3554329

0

具有地址保存执行结果“1”总是会导致1111 1111,不会吗?

不,为什么它应该是全1?如果您的值为1(即000000..0001),您只设置位被设置为“或”值,即只有1个最低有效位

无论什么值xyzxyz您的地址GESTIC_I2C_ADDR可能是,您的结果是xyzxyz1之后。

没有理由为什么所有其他位都会受到影响。


什么我不明白,是这如何,如果条件的作品。当8位二进制数的所有位都设置为1时是否为真?

那么,从数学上来说:是的。 ;) 但不是“IF和ONLY IF”全部5位都置位。 如果只设置了一个位,则也是如此。

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

如果你明白这一点,你理解这个词“按位”,一切都应该是清楚的。

我不知道你如何让上面,如果你已经做了它对理解这个意思的问题。

+0

“不,为什么它应该全是1?如果您或值1(即000000..0001)您只设置ORed值中设置的位,即只有1个最低显著位“。因为我笨,以为1是所有的人,因此每一个比特获取与1 或运算非常感谢您对您的帮助! – user3554329

+0

请不要混淆“雏但愿意学习”和“愚蠢”。即使是错误的假设可能有合理的理由。 – Gerhardh