标题: 逻辑太差了搞不懂C语言数值增加与移动 [打印本页]

作者: xiaohu520    时间: 2020-4-25 19:21
标题: 逻辑太差了搞不懂C语言数值增加与移动
rekey定义为无符号字符型,首先是将最低位左移归零,但是后面的rekey不是数字 1  2  3 4... 累计增加变化的吗 ,那在左移是啥操作,比如当前rekey是5二进制是0101,执行左移是不是就是1010了,然后在加1,就是6二进制就是0110,执行左移就是1100了?那是不是rekey就是当前加到的值得二进制移动的最终数?大神帮解析一下呢  感谢

作者: csmyldl    时间: 2020-4-25 21:25
这段程序是把读到的键盘状态存入rekey中,左移1位是为了腾出最右边的1位空间,加1是当状态为高电平时,把1存到上述所腾出的最右1位空间处
作者: hantu    时间: 2020-4-26 01:22
左移一位,就把最高位的给丢掉了,低位是补进0来的,然后它DIO是高电平的话就加1(也就是从低位把一个bit的数据读进来,如果是低电平就什么不加就行了)
不管原来的rekey是什么内容的,反正循环的8次就刚好读进来一个字节。
比如原来rekay是            ????????
左移1位变成                  ???????0  如果DIO是低电平0就保持这个
下一趟循环继续左移变成 ??????00  如果DIO是高电平1的话就加上1变成了 ??????01
...
循环结束时就读够了一个字节的数据


作者: xiaohu520    时间: 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 。。。这些数左移的
作者: xiaohu520    时间: 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左移不就是对当前的数字二进制进行位移吗?这样就对不上最终结果了。  这一块老打不通
作者: chomou    时间: 2020-4-26 08:30
比如rekay是5,第一次循环 0101左移1010加一1011(DIO是高电平1)
                           第二次循环 1011左移0110保持0110(DIO是低电平0)
                           第三次循环 0110左移1100加一1101

作者: f556    时间: 2020-4-26 10:14
xiaohu520 发表于 2020-4-26 08:10
unsingede char  rekey不是 1(0001) 2(0010) 3(0110) 4(0100) 。。。 这样方式的增加的? 那左移 ...

位是二进制的位,不要扯上十进制。<< | & ....都是二进制。除了++可以用十进制(也可不用十进)。一定要放弃十进制,用二进制或16进制。
多年前的高手说编程用十六进制方便,后来自己理解了为什么用HEX。
作者: xiaohu520    时间: 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的?
作者: xiaohu520    时间: 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++不就是数值得累加吗   谢谢指点迷津
作者: xiaohu520    时间: 2020-4-26 16:47
f556 发表于 2020-4-26 10:14
位是二进制的位,不要扯上十进制。

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

作者: wulin    时间: 2020-4-26 18:39
如果当前rekey是5,二进制是0000 0101,执行左移一位就是0000 1010,然后再加1,就是0000 1011。
作者: chomou    时间: 2020-4-26 21:00
xiaohu520 发表于 2020-4-26 13:23
第一次循环 0101左移1010加一1011(DIO是高电平1),这个加1不是5+1的吗?为啥是位上加1的?

rekey已径左移一位了,为什么还是5呢,要按你这样算也应该是10+1吧
作者: f556    时间: 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 。
想问一下你是女、还是男?
作者: xiaohu520    时间: 2020-4-27 08:31
f556 发表于 2020-4-26 21:05
I服了you。
++是++,不要扯到移位。






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1