技术论坛

 颠倒一个字节

返回主题列表
作者 主题
芳季
至圣

经验值: 66574
发帖数: 14746
精华帖: 100
楼主    2019-06-04 17:41:33
主题:颠倒一个字节

如何可以方便把一个字节或者一个字的全部位逆向重新排列一次。

最高位变成最低位,调头。

补充:

有用的位数是2到16位。

有用的位对齐字节低位。

无用的位不要影响本程序,本程序也不要影响无用位。

有用位的数量有一个字节记录。

看雪001
至圣

经验值: 19336
发帖数: 2076
精华帖: 72
1楼    2019-06-04 18:46:47
主题:回复:颠倒一个字节
for:目标字最低位:=源字最高位,目标字循环右移动一位,源字循环左移动一位,next
大道至简,知易行难
--意孤行
奇侠

经验值: 5096
发帖数: 520
精华帖: 7
2楼    2019-06-04 19:26:12
主题:回复:颠倒一个字节

是不是只能做一个子程序,使用临时变量对调??

认真做事,低调做人
芳季
至圣

经验值: 66574
发帖数: 14746
精华帖: 100
3楼    2019-06-04 21:13:56
主题:回复:颠倒一个字节

楼上。不用做出来,就是给给方案,讨论一下可以了。象一楼那样。

只不过我觉得用两个移位来对接感觉有点工程浩大。

还有一个条件。这串有用的0101的位数不定,从2位到8位(16位)。

还有还有,我说漏了很多,原数值的0101是低位对齐。转换后也要低位对齐。

芳季
至圣

经验值: 66574
发帖数: 14746
精华帖: 100
4楼    2019-06-04 21:27:06
主题:回复:颠倒一个字节

如果有必要追查为何会产生这个局面,那么我也可以把事情原原本本地分享出来。

或许可能我处理这件事绕弯了。进入胡同要找地方调头。

sangshunyang
侠圣

经验值: 4092
发帖数: 565
精华帖: 4
5楼    2019-06-04 22:18:20
主题:回复:颠倒一个字节

用覆盖(AT)变量比较好做

Zaxife
至圣

经验值: 12573
发帖数: 2503
精华帖: 31
7楼    2019-06-05 09:25:05
主题:回复:颠倒一个字节

既然只是一个字节倒序,那么肯定是用最直观最简单的位逻辑交换了。

如果要用For循环就太浪费时间了不值得。

改了一下整合到一个网络里面。


整合到一个网络的原因是因为程序中有中断的话能够保证这个网络执行完成,而不会因为跨网络引起L区临时数据发生改变再回来执行子程序导致结果错误(感觉smart的编译器不会处理子程序、中断L区出入栈数据保护问题)。


楼下说的网络1、10删除?如果别人直接使用同一个地址(比如都是用VB0),如果你不事先清零就会导致最后结果所有位都是1咯。其实,按照C语言编程习惯,这种有中断、多线程的场合,必须把数据全部拷贝到子程序、线程内部来处理后再返回结果。这样可以保证子程序、线程在处理周期内数据是执行时候的状态。算了,数据一致性的问题学学多线程就知道了。


winter938
至圣

经验值: 10680
发帖数: 1561
精华帖: 33
8楼    2019-06-05 10:10:52
主题:回复:颠倒一个字节

的确,这个看起来笨拙的程序可能是最快的,另LB0设置成IN型的,LB1设置OUT型的,子程序中网络1和10可以删除。这个转换过程实际都是即时的无需借助INOUT型参数保存过程数据。

工控爱好者
winter938
至圣

经验值: 10680
发帖数: 1561
精华帖: 33
9楼    2019-06-05 10:21:22
主题:回复:颠倒一个字节

要倒1个字,可以调用两次上面贴中那个字节倒换的子程序,具体过程如下

原数:1----8 9----16

字节交换:9----16 1----8

两次字节倒换:16----9 8----1

楼主的这个任务使用循环做会比较耗时,我建议7楼的做法,甚至字倒换都可以那样做,程序虽然看起来啰嗦一些,但执行速度和程序消耗空间并不是不值得的。

工控爱好者
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。