鄙人在看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)
{
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位二进制: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709204652844.png)
资料来源网站:
论坛地址
C语言int转二进制程序
|