签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
多字节的奇偶性,是指多个字节中,BIT位为1的个数的奇偶性。
字节的奇偶性,在Smart中没有直接可用的状态位,无法直接作出判断。
当然,最原始的方法,就是按位一个一个地数,这个效率显然不可接受。
先看XOR异域运算的一个特征,A、B、C均为位变量:
假如:C=A XOR B
那么,A、B两个位组合的奇偶性,与C的奇偶性相同。
因此,可以使用XOR运算,把N个字节的奇偶性,浓缩到 1个字节中。
再对1个字节的8个BIT,一个一个地数1的个数,相对来说,效率提高不少。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1766326&b_id=64&s_id=0&num=17
异或运算,用来多字节的奇偶性浓缩到单字节中。
能用上的时候就会了。
引用1楼详细内容:
呃…奇偶判断用异或来做算法? 我印象中字节、半字节查表是最安逸的了。 现在除了为了兼容古董通讯协议外,基本上都不用奇偶校验了。直接一帧数据检验更符合通讯事务。
终于知道啥意思了,也就是想用更简单更快的校验码来替换Modbus的CRC计算?
这种奇偶校验容错太差了,估计都不敢用哦。
比如一个字节二进制位是 1000 0000 与 0100 0000 / 0010 0000 / 0001 0000 ......大概有2^7-1个数据都满足了奇偶校验正确,但是这个校验正确的数不是我们原来的数据啊,所以这种容错太低的校验码绝对不适合数据交换啊。
如果再把这个校验方式用到更多个数据帧上?这容错率得多烂?估计想死的心都有了啊。所以最早的时候这种校验只敢用在一个字节里面校验,现在嘛谁还敢用?
若干个位的异或⊕运算结果在任意交换位的次序后运算结果仍然保持不变。
A⊕B=B⊕A=!A*B+!B*A
A⊕B⊕C=A⊕C⊕B=C⊕A⊕B=B⊕A⊕C=B⊕C⊕A=C⊕B⊕A
因此多字节的所有位奇偶性的判断可以逐个字节进行异或运算,然后对结果字节的8个位再进行异或运算,得到最终结果
厉害。 这才是论道。
依稀记得有个日系的啥品牌PLC支持的一个通讯协议计算通讯帧的校验码就是对通讯数据帧逐字节进行异或运算到最后一个字节得到校验码。
异域运算的校验强度,与“累加和”的校验强度差不多。在Modbus通讯中,Modbus-ASCII检验方式LRC类似这种校验。
浮云游子不流连
所说的高手在民间的到印证!
请问楼主,不知道这样的奇偶性判断在实际中有应用吗?具体是干什么的
最初想法来自另一热贴:80工位开关控制同一个灯。
不讲那个贴子的真正用途。
重新假设一个控制要求:有80个工位,每个工位上有一个双位开关,扳动此开关,可以控制共同的一个灯的亮灭,任一开关变位(扳动变换状态),导致灯的状态翻转。
一个一个开关进行判断,当然是可以的,但效率显然是最低的。
把80个开关状态整理进10个字节中,每一位代表一个开关状态。
不难发现,变化其中一位,实际上会导致10个字节的奇偶性发生变化。
所以,只要检测10个字节的奇偶性,就可以控制灯的状态是否翻转。
这个整的好麻烦,如果只是为了管灯的状态,10个字节做个缓存,分别和前一周期对比,对比完MOV到缓存位置,不相等就执行一次改变灯状态的命令就完事了
这个其实有现成的算法,参考 算法心得-高效算法的奥秘 一书。
-------------------------------------------------------
做个测试,没有在PLC中做,计算位串中1的个数。
如果是判断1个数的奇偶性就/2判断。
请问这个用来求多字节1的个数对吗,如果若A=11111111,B=11111111 都为8个1,A XOR B以后=00000000,1的个数为0?不是很理解
0是不是就是说偶数个1了?这不就对了吗。
日系PLC直接一条指令搞定(1的个数),西门子还要写一大堆的程序,日系PLC表示很无奈。
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录