看了坛友的帖子,我也觉得奇偶校验的作用也挺大的(原理参照原帖https://bbs.21ic.com/icview-3491168-1-1.html)。于是,我也提供一则奇偶校验算法。 我的算法是基于C语言中的异或操作。根据异或操作的原理,1^1 =0, 1^0=1。算法如下: - /**
- * 计算32位word的奇校验位(使用异或操作优化)
- * @param data 32位输入数据
- * [url=/u/return]@return[/url] 奇校验位(1或0)
- */
- uint8_t odd_parity_word(uint32_t data) {
- // 使用异或操作快速计算奇偶性
- // 通过分治思想将32位数据逐步压缩到1位
- data ^= data >> 16;
- data ^= data >> 8;
- data ^= data >> 4;
- data ^= data >> 2;
- data ^= data >> 1;
-
- // 取最低位作为奇偶性,然后转换为奇校验
- // 如果data最低位为1,说明1的个数为奇数,奇校验位为0
- // 如果data最低位为0,说明1的个数为偶数,奇校验位为1
- return (~data) & 1;
- }
算法的时间复杂度也实现到了O(log n)。供大家参考。
|