你的问题答案
&和&&在C语言中都是双目运算符,即在使用它们时,在运算符的两侧都各要有一个操作数,如:a&b或c&&d。
但&是二进制运算符,它在执行时,将左右两侧的操作数按二进制数逐位地进行运算,比如: a=0x57; b=0xac; c=a&b;
a: 0 1 0 1 0 1 1 1
b: 1 0 1 0 1 1 0 0
&
----------------------------------
c: 0 0 0 0 0 1 0 0
所以执行后,c的值为0x04。
&&是逻辑运算符,它在执行时,将左右两侧的操作数都当作逻辑值,即真或假对待,然后按照逻辑与(两者同时为真,结果才为真)的规则,得出运算结果,结果也是逻辑值。这里有个事实要记住,C语言在判断一个量是真还是假时的依据是:只有0是假,一切非0值都是真;而C语言在表示一个值的真假时,用1(即0x01)表示真,用0(即0x00)表示假。
还以上例为例,a=0x57; b=0xac; c=a&b;
a: 0 1 0 1 0 1 1 1 C语言翻译为-----> 0000 0001 (由非零为真翻译来的)
b: 1 0 1 0 1 1 0 0 C语言翻译为-----> 0000 0001 (由非零为真翻译来的)
&& &&
---------------------------------- -------------------------
c: 0 0 0 0 0 1 0 0 0000 0001 (C语言给出的结果,真)
上例按&&运算后,c的值为0x01,表示真。
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80) SDA=1;
else SDA=0;
}
}
这个函数的功能是:将调用时的单字节实参值,通过SDA线发送出去,发送时,高位(左侧的位)先发送。以如下调用为例:SendByte(0xa5); 函数执行时的过程如下:
1、刚进入SendByte()函数时,BitCnt取值为0,即对c不进行左移操作,用c的原值与0x80进行与操作,因为0xa5和0x80的最高位都是1,与的结果最高位也是1,为非0,为真,执行SDA=1;将数字1发送到SDA线上,此值正好与0xa5的最高位相同,符合实际。
2、当第一轮发送完1后,由于头一轮循环的最后执行了BitCnt++,BitCnt取值为1,再次执行c<<BitCnt,将c的值整体左移一位,即将次高位移到最高位,最高位移入单片机的进位位Cy,右侧移空的位填上0,移位的结果为0x4a,将这个结果再与0x80相与,因为0x80只有最高位为1,所以只有0x4a中的最高位可以保持原值,而0x4a中的其余位因为与0x80中的0相与,结果一定为0,所以(c<<BitCnt)&0x80结果是真是假,完全由0x4a的最高位决定,而0x4a的最高位是原数0xa5的次高位,实际执行的是SDA=0;将0(原数次高位)发送出去,
按照2的执行过程,直到将0xa5的最后一位发送出去。