f556 发表于 2020-4-26 21:05 ![]() |
xiaohu520 发表于 2020-4-26 16:11 I服了you。 ++是++,不要扯到移位。 <<位左移,是另一个语句,程序是一步一步执行的,自己的思路也要一步步来,不能混为一谈。移位就象一列火车,你在原地只能看到8节有货无货车箱xxxx【1011 0001】,左移动1节后车箱后你看到【0110001?】,?处补0 。 想问一下你是女、还是男? |
xiaohu520 发表于 2020-4-26 13:23 rekey已径左移一位了,为什么还是5呢,要按你这样算也应该是10+1吧 |
如果当前rekey是5,二进制是0000 0101,执行左移一位就是0000 1010,然后再加1,就是0000 1011。 |
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的移位 。是不是太笨了不适合学了 ![]() ![]() |
chomou 发表于 2020-4-26 08:30 第一次循环 0101左移1010加一1011(DIO是高电平1),这个加1不是5+1的吗?为啥是位上加1的? |
xiaohu520 发表于 2020-4-26 08:10 位是二进制的位,不要扯上十进制。<< | & ....都是二进制。除了++可以用十进制(也可不用十进)。一定要放弃十进制,用二进制或16进制。 多年前的高手说编程用十六进制方便,后来自己理解了为什么用HEX。 |
比如rekay是5,第一次循环 0101左移1010加一1011(DIO是高电平1) 第二次循环 1011左移0110保持0110(DIO是低电平0) 第三次循环 0110左移1100加一1101 |
hantu 发表于 2020-4-26 01:22 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左移不就是对当前的数字二进制进行位移吗?这样就对不上最终结果了。 这一块老打不通 ![]() |
csmyldl 发表于 2020-4-25 21:25 unsingede char rekey不是 1 2 3 4 。。。 这样方式的增加的? 那左移是不是就是对 1 2 3 4 。。。这些数左移的 |
左移一位,就把最高位的给丢掉了,低位是补进0来的,然后它DIO是高电平的话就加1(也就是从低位把一个bit的数据读进来,如果是低电平就什么不加就行了) 不管原来的rekey是什么内容的,反正循环的8次就刚好读进来一个字节。 比如原来rekay是 ???????? 左移1位变成 ???????0 如果DIO是低电平0就保持这个 下一趟循环继续左移变成 ??????00 如果DIO是高电平1的话就加上1变成了 ??????01 ... 循环结束时就读够了一个字节的数据 |
这段程序是把读到的键盘状态存入rekey中,左移1位是为了腾出最右边的1位空间,加1是当状态为高电平时,把1存到上述所腾出的最右1位空间处 |