鄙人在看I2C的驱动时,发现如下两条语句:
SDA = dat>>7;
dat = dat<<1;
论坛上的解释如下:
SDA是只能有一个位的信息,如果你让SDA=dat的话(dat是字节):
当dat里任何一位是1的:SDA就会是1;
当dat里全部位都是0,SDA就是0。
那么SDA要逐一地取dat的每一个位怎么办呢?
①dat>>7:
dat一个字节总共8个位的数据向右移7个位,原来的最高位就移到了最右的位置,左边7个位赋值0,SDA=dat>>7实际也就是取得了原先最高位的值。
②dat=dat<<1:
是让dat左移一位且赋值回来,使原来最高位的溢出,最低位赋值为0。
③重复前面的步骤,重复8次,SDA就会把dat的8个位都给发送完毕。
C语言进行移位测试:
#include <iostream>
#include<stdio.h>
void intobit(int num)
/*
num是要以二进制形式输出的int值
将二进制数据逐个置1,在右移,依次实现逐个输出
*/
{
int tnum = num;
int i;
for (i = 31; i >= 0; i--)
{
int tmpa = tnum;
tmpa = tnum & (1 << i);
((i + 1) % 8 == 0 && i != 31) ? printf(" %d", tmpa >> i) : printf("%d", tmpa >> i);
}
printf("\n");
}
int main()
{
int dat = 170;
intobit(dat);
int SDA = (dat >> 7);
intobit(SDA);
dat = dat << 1;
intobit(dat);
return 0;
}
仅观察低8位二进制:
资料来源网站: