备份总结:位运算符异或的重新学习。

在处理tm1637 的数码管控制代码中看到了以下代码

 for(i=0;i<8;i++)        //sent 8bit data
  {
    digitalWrite(Clkpin,LOW);      
    if(wr_data & 0x01)digitalWrite(Datapin,HIGH);//LSB first
    else digitalWrite(Datapin,LOW);
    wr_data >>= 1;      
    digitalWrite(Clkpin,HIGH);
      
  }  

对于上面两句代码不理解,于是就重新学习了一下:

if(wr_data & 0x01)digitalWrite(Datapin,HIGH);
wr_data >>= 1;      

因为平常学习的语言都没有这么操作的,补习的结果才明白在arduino中(应该包括C和C++):

我们的运算符其实分为:

算术运算符、关系运算符、逻辑运算符、位运算符、混合运算符

平常用的比较多的就是前三,偶尔会有第5,对于位运算符用的比较少,偶尔会有些同学用来处理权限,而个人其实很少用到异或这种东西,而异或这种在PHP这种语言中它是逻辑运算符。

这个区分其实很重要,但是说回来位运算符。

我们有个数字 127,它的2进制八位码是

01111111

当它和0x01进行按位与(&)的位运算的时候,如下图

01111111

00000001

只有对应的两个二进制位都为1时,结果位才为1,所以127&0x01 的结果是

00000001

结果是1

也就是上面的wr_data & 0x01 位运算

而接下来的代码

wr_data >>= 1

这里面的>>= 是位运算符和混合运算符,它等效于

wr_data= wr_data>> 1

也就是把wr_data对应的值右移一位,左边用0填充。

于是原来的

01111111

变成了

00111111

在最上面的代码中由于循环了8次,等于说就把wr_data对应的值按照二进制从右第一位开始到最后一位同0x01进行了与的位计算,由于是和0x01也就是1进行的位计算,每次计算都能得到每一位的值。例如

01111111   00111111  00011111 。。。00000000

00000001  00000001  00000001 。。。00000001

1               1                 1 .。。。0

按照顺序输出的就是1、1、1、1、1、1、1、0

通过8次循环执行下面的代码

wr_data & 0x01

wr_data >>= 1;  

就把wr_data的十进制值对应的二进制值的每一位获取出来了。

然后再按照需要传入对应数码管的寄存器中,就完成了数码管的控制。

它这个给数码管的输出好像还是有问题,好像有专门的函数可以自动处理这个转换!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值