c++ - 这段代码如何计算一个数的奇偶性?

标签 c++ algorithm bit-manipulation xor parity

<分区>

所以我应该找到一个数字的奇偶校验,如果给定数字的二进制表示中有奇数个设置位,则奇偶校验为奇数,否则。我有一个解决方案,但代码不是很容易理解,因此我正在寻找一个解释。

int y = x ^ (x >> 1); //given number is x.
y = y ^ (y >> 2); 
y = y ^ (y >> 4); 
y = y ^ (y >> 8); 
y = y ^ (y >> 16); 
// Rightmost bit of y holds the parity value 
// if (y&1) is 1 then parity is odd else even 
if (y & 1) 
 return odd; 
return even;

最佳答案

这很简单。这是合并位以获得奇偶校验位的方式:

Bit numbers:

0    1    2    3    4    5    6   7
 \  /      \  /      \  /     \  /
  01        23        45       56        x ^ (x >> 1)
    \      /            \     /
     \    /              \   /
      0123                4567           y ^ (y >> 2);
          \              /
           \            /
            \          /
             \        /
              01234567                   y ^ (y >> 4); 

简单地说,这棵树显示了如何有效地评估最年轻的位。 请注意,每一步都有额外的对,但它们不会对最终结果产生影响。

关于c++ - 这段代码如何计算一个数的奇偶性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952580/

相关文章:

rust 溢出左移

c++ - 如何使用 QWebView 更改网页的默认标题

java - 添加新线程时的堆栈行为

c++ - 使用输入文件流 C++ 初始化对象的构造函数

algorithm - 有向图相对于其 DFS 树可以有 Ω(n^2) 条交叉边吗?

algorithm - 移除子集的博弈算法 [HW/Study]

c++ - 如何用范围内的随机值填充数组? (重复是可以的。)

algorithm - STM32L1xx 上的闪存 ECC 算法

algorithm - 找到通过大多数点的直线的最有效算法是什么?

java - 合并 char 数组会颠倒顺序