c++ - 两个数字异或后设置位的奇偶校验

标签 c++ xor parity

我通过在 C++ 中进行测试发现了一个观察结果。

观察是,

1 ) 如果两个数字中都有奇数 个设置位,那么它的 XOR 将有偶数 个设置位。

2 ) 如果两个数字中都有偶数个设置位,那么它的异或将有偶数个设置位。

1 ) 如果两个数一个数的置位位数为偶数,而另一个数的置位位数为奇数,则其 XOR 将为奇数 strong> 其中设置的位数。

我无法证明。我想证明这一点。请帮助我。

我在我的电脑上执行的代码是

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int> vec[4];
    for(int i=1;i<=100;i++){
       for(int j=i+1;j<=100;j++){ 
         int x=__builtin_popcount(i)%2;
         int y=__builtin_popcount(j)%2;
         int in=0;
         in|=(x<<1);
         in|=(y<<0);
         int v=__builtin_popcount(i^j)%2;
         vec[in].push_back(v);
      }
    }
      for(int i=0;i<4;i++){
         for(int j=0;j<vec[i].size();j++) cout<<vec[i][j] << " ";
         cout << endl;
      }
   return 0;
}

它给了我

第一行100个零 第二行100个 第三行100个 第四行100个零

如果对理解代码有疑问,请在评论中告诉我。

最佳答案

这种行为反射(reflect)了一个易于证明的算术事实:

  • 当你将两个奇数相加时,你会得到一个偶数,
  • 当你将两个偶数相加时,你会得到一个偶数,
  • 当您将奇数与偶数相加时,您会得到一个奇数。

有了这个事实,考虑XOR 的真值表,并注意表中的四个选项中的每一个 ({0, 0 => 0}, {0, 1 => 1}, {1, 0 => 1}, {1, 1, => 0} ) 1 计数的奇/偶校验保持不变。换句话说,如果输入有奇数个 1,则输出也将有奇数个 1,反之亦然。

这个观察解释了为什么你会观察到这个结果:XOR将两个数字与 NM 的设置位计数相结合将产生一个与 N+M 具有相同奇/偶校验的数字。

关于c++ - 两个数字异或后设置位的奇偶校验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438913/

相关文章:

c - 奇数位的位奇偶校验码

assembly - 计算设置位。 16位汇编奇偶校验程序

c++ - 混合调试和发布库 : Windows vs Linux, 静态与共享

c++ - 了解 C++ 中 vector 实例占用的空间

java - 如何在不转换为二进制字符串的情况下计算海明码?

java - 异或的反函数是什么?

c - 128 位类型错误

C++ MapType::iterator 使用更新值

c++ - Clang 跳过初始化列表构造的处理

arrays - 数组中 xor 最大的三个元素