当前位置 博文首页 > dadalaohua的博客:【位操作笔记】计算奇偶性 普通方法

    dadalaohua的博客:【位操作笔记】计算奇偶性 普通方法

    作者:[db:作者] 时间:2021-07-27 14:50

    计算奇偶性(Compute parity) 普通方法

    计算奇偶性(Compute parity)指的是,计算一个数所包含1的个数是奇数还是偶数,例如一个8位数0x5b = 0b?0101 1011?,其中1的个数为5,是奇数;一个8位数0xa3 = 0b??1010 0011?,其中1的个数为4,是偶数。该算法可以用于奇偶校验位的计算与验证。

    算法说明

    使用了一种类似于Brian Kernigan’s的位计数的方法,该算法每次清除从最低位到最高位数的第一个为1的位。所需时间与置位的位数成正比。

    如果设置了奇数位数,返回true,否则返回false。

    实现代码

    bool computing_parity(unsigned int val)
    {
        bool parity = false;
    
        while (val)
        {
            parity = !parity;
            val = val & (val - 1);
        }
        
        return parity;
    }
    

    算法计算过程

    算法核心在于val = val & (val - 1)这句代码。val & (val - 1)会使val中位置最靠右并且值为1的bit位置0,也就是用于清除掉从最低位到最高位数的第一个为1的位,循环中每次都能清除一个位,每清除一个位,奇偶性就反转一次,根据清除位的次数,就可以知道数包含1的个数奇偶性。

    例如一个数为0b0110 1000

    parity           : parity = 0(flase)偶数
    val              : val = 0b0110 1000
    val              : val > 0
    val & (val - 1)
    
        0b0110 1000
    &   0b0110 0111
    ---------------
        0b0110 0000
    
    parity           : parity = 1(true)奇数
    val              : val = 0b0110 0000
    val              : val > 0
    val & (val - 1)
    
        0b0110 0000
    &   0b0101 1111
    ---------------
        0b0100 0000
    
    parity           : parity = 0(flase)偶数
    val              : val = 0b0100 0000
    val              : val > 0
    val & (val - 1)
    
        0b0100 0000
    &   0b0011 1111
    ---------------
        0b0000 0000
    
    parity           : parity = 1(true)奇数
    val              : val = 0b0000 0000
    val              : val = 0
    

    最后得到结果,parity为true,1的个数为奇数。

    完成奇偶性计算。


    [参考资料]

    Bit Twiddling Hacks By Sean Eron Anderson

    [Hacker’s Delight] 作者: Henry S. Warren Jr.


    本文链接:https://blog.csdn.net/u012028275/article/details/112441315

    cs