本文主要是介绍【位操作笔记】计算奇偶性 异或和右移查表法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
计算奇偶性(Compute parity) 异或和右移查表法
计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b0101 1011,其中1的个数为5,是奇数;一个8位数0xa3 = 0b1010 0011,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。
算法说明
先通过移位和位移,将32位数值压缩成4位数值,再使用这个值作为一个索引来进行右移,类似于一个小型的16位奇偶性表格,来查找奇偶性。一共只需要9步运算就可以完成。
如果设置了奇数位数,返回true,否则返回false。
实现代码
bool computing_parity(unsigned int val)
{val ^= val >> 16;val ^= val >> 8;val ^= val >> 4;val &= 0xf;return (0x6996 >> val) & 1;
}
算法计算过程
-
第一步和第二步
v ^= v >> 16
将32位数值压缩成16位数值。因为异或操作和奇偶性的特点,这个操作只会减少置位的bit数,但不影响奇偶性。接下来就只关心低16位的数值。
-
第三步和第四步
v ^= v >> 8
将16位数值压缩成8位数值。因为异或操作和奇偶性的特点,这个操作只会减少置位的bit数,但不影响奇偶性。接下来就只关心低8位的数值。
-
第五步和第六步
v ^= v >> 4
将8位数值压缩成4位数值。接下来就只关心低4位的数值。
-
第七步
v &= 0xf
剔除无用的bit位的数据,只剩下低4位的数值。
-
第八步
0x6996 >> val
0x6996 转换成二进制就是 0110 1001 1001 0110,这个相当于是一个16位奇偶性表格,通过右移上一步计算出的数值,就能得到数值的奇偶性。
-
第九步
& 1
得到奇偶性。
例如一个数为0x355C4E25,二进制为0b00110101010111000100111000100101,共15bit
v ^= v >> 16
-
v ^= v >> 8
-
v ^= v >> 4
-
v &= 0xf
-
0x6996 >> val
-
& 1
最后得到结果,为奇数。
完成奇偶性计算。
完整过程
拓展
计算8位的奇偶性 。使用该方法运算,只用5次运算就能完成计算。
bool computing_parity(unsigned int val)
{val ^= val >> 4;val &= 0xf;return (0x6996 >> val) & 1;
}
[参考资料]
Bit Twiddling Hacks By Sean Eron Anderson
[Hacker’s Delight] 作者: Henry S. Warren Jr.
本文链接:https://blog.csdn.net/u012028275/article/details/112644553
这篇关于【位操作笔记】计算奇偶性 异或和右移查表法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!