找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2548|回复: 13
打印 上一主题 下一主题
收起左侧

逻辑太差了搞不懂C语言数值增加与移动

[复制链接]
跳转到指定楼层
楼主
rekey定义为无符号字符型,首先是将最低位左移归零,但是后面的rekey不是数字 1  2  3 4... 累计增加变化的吗 ,那在左移是啥操作,比如当前rekey是5二进制是0101,执行左移是不是就是1010了,然后在加1,就是6二进制就是0110,执行左移就是1100了?那是不是rekey就是当前加到的值得二进制移动的最终数?大神帮解析一下呢  感谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-4-25 21:25 | 只看该作者
这段程序是把读到的键盘状态存入rekey中,左移1位是为了腾出最右边的1位空间,加1是当状态为高电平时,把1存到上述所腾出的最右1位空间处
回复

使用道具 举报

板凳
ID:462827 发表于 2020-4-26 01:22 | 只看该作者
左移一位,就把最高位的给丢掉了,低位是补进0来的,然后它DIO是高电平的话就加1(也就是从低位把一个bit的数据读进来,如果是低电平就什么不加就行了)
不管原来的rekey是什么内容的,反正循环的8次就刚好读进来一个字节。
比如原来rekay是            ????????
左移1位变成                  ???????0  如果DIO是低电平0就保持这个
下一趟循环继续左移变成 ??????00  如果DIO是高电平1的话就加上1变成了 ??????01
...
循环结束时就读够了一个字节的数据

回复

使用道具 举报

地板
ID:90619 发表于 2020-4-26 08:03 | 只看该作者
csmyldl 发表于 2020-4-25 21:25
这段程序是把读到的键盘状态存入rekey中,左移1位是为了腾出最右边的1位空间,加1是当状态为高电平时,把1 ...

unsingede char  rekey不是 1 2 3 4 。。。 这样方式的增加的? 那左移是不是就是对  1 2 3 4 。。。这些数左移的
回复

使用道具 举报

5#
ID:90619 发表于 2020-4-26 08:10 | 只看该作者
hantu 发表于 2020-4-26 01:22
左移一位,就把最高位的给丢掉了,低位是补进0来的,然后它DIO是高电平的话就加1(也就是从低位把一个bit的 ...

unsingede char  rekey不是 1(0001) 2(0010) 3(0110) 4(0100) 。。。 这样方式的增加的? 那左移是不是就是对  1(0001) 2(0010) 3(0110) 4(0100) 。。。这些数左移的,比如当前rekey加到了5(0101),下一个指令是对5左移,就是0101——变成1010了,我是搞不懂 rekey++不就是数字的累加吗,而rekey左移不就是对当前的数字二进制进行位移吗?这样就对不上最终结果了。  这一块老打不通
回复

使用道具 举报

6#
ID:727081 发表于 2020-4-26 08:30 | 只看该作者
比如rekay是5,第一次循环 0101左移1010加一1011(DIO是高电平1)
                           第二次循环 1011左移0110保持0110(DIO是低电平0)
                           第三次循环 0110左移1100加一1101
回复

使用道具 举报

7#
ID:282850 发表于 2020-4-26 10:14 | 只看该作者
xiaohu520 发表于 2020-4-26 08:10
unsingede char  rekey不是 1(0001) 2(0010) 3(0110) 4(0100) 。。。 这样方式的增加的? 那左移 ...

位是二进制的位,不要扯上十进制。<< | & ....都是二进制。除了++可以用十进制(也可不用十进)。一定要放弃十进制,用二进制或16进制。
多年前的高手说编程用十六进制方便,后来自己理解了为什么用HEX。
回复

使用道具 举报

8#
ID:90619 发表于 2020-4-26 13:23 | 只看该作者
chomou 发表于 2020-4-26 08:30
比如rekay是5,第一次循环 0101左移1010加一1011(DIO是高电平1)
                           第二次循环 ...

第一次循环 0101左移1010加一1011(DIO是高电平1),这个加1不是5+1的吗?为啥是位上加1的?
回复

使用道具 举报

9#
ID:90619 发表于 2020-4-26 16:11 | 只看该作者
f556 发表于 2020-4-26 10:14
位是二进制的位,不要扯上十进制。

定义的unsignedchar rekey,rekey++,不就是1(0001) 2(0010) 3(0011) 4(0100)..这样的累加的吗?执行到了rekey++这个指令的时候是不是就是rekey为某一个数值(unsigned char型的数值),然后下一个指令rekey<<1,是不是对当前rekey加的值,进行左移的?   想不明白rekey的移位只是一位一位的增加一.比如5+1之后的移位,和0101的移位    。是不是太笨了不适合学了 ,也知道移位是二进制的位在移位,就是想不通,rekey++这一步是怎么和位进行联系的,rekey++不就是数值得累加吗   谢谢指点迷津
回复

使用道具 举报

10#
ID:90619 发表于 2020-4-26 16:47 | 只看该作者
f556 发表于 2020-4-26 10:14
位是二进制的位,不要扯上十进制。

写了一个rekey程序调试,这个和那个rekey变化意义是一样的吗 ?调试下来就是数值得累加,没有每个位在移动呢
回复

使用道具 举报

11#
ID:213173 发表于 2020-4-26 18:39 | 只看该作者
如果当前rekey是5,二进制是0000 0101,执行左移一位就是0000 1010,然后再加1,就是0000 1011。
回复

使用道具 举报

12#
ID:727081 发表于 2020-4-26 21:00 | 只看该作者
xiaohu520 发表于 2020-4-26 13:23
第一次循环 0101左移1010加一1011(DIO是高电平1),这个加1不是5+1的吗?为啥是位上加1的?

rekey已径左移一位了,为什么还是5呢,要按你这样算也应该是10+1吧
回复

使用道具 举报

13#
ID:282850 发表于 2020-4-26 21:05 | 只看该作者
xiaohu520 发表于 2020-4-26 16:11
定义的unsignedchar rekey,rekey++,不就是1(0001) 2(0010) 3(0011) 4(0100)..这样的累加的吗? ...

I服了you。
++是++,不要扯到移位。
<<位左移,是另一个语句,程序是一步一步执行的,自己的思路也要一步步来,不能混为一谈。移位就象一列火车,你在原地只能看到8节有货无货车箱xxxx【1011 0001】,左移动1节后车箱后你看到【0110001?】,?处补0 。
想问一下你是女、还是男?
回复

使用道具 举报

14#
ID:90619 发表于 2020-4-27 08:31 | 只看该作者
f556 发表于 2020-4-26 21:05
I服了you。
++是++,不要扯到移位。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表