我通过在C++中进行测试找到了一个观察结果。
观察是,
1)如果两个数都有奇数的集合位数,则XOR的集合位数为偶数数。
2)如果两个数都含有偶数的集合位,则其异或中包含偶数位数。
1)如果两个数,一个数有偶数的集合位,和,另一个数有奇数的集合位,则它的XOR中有奇数的集合位数。
我无法证明这一点。我想证明这一点。请帮帮我。
我在计算机上执行的代码是
#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个
如果在理解代码方面有疑问,请在评论中告诉我。
发布于 2018-05-20 20:47:32
谢谢所有想要回答的人。
我们可以提供这样的证据,
假设N是第一个数中的集合位数,M是第二个数中的设置位数。
然后,这两个数字中的set位是N+M -2 (Δ),其中δ是两个数字都设置了位的位位置的总数。这个表达式解释了每一件事。
偶数+奇数-偶=奇
奇+奇-偶数=偶数
偶数+偶-偶=偶
发布于 2018-05-20 20:18:00
这种行为反映了一个易于证明的算术事实:
有了这个事实,请考虑XOR的真值表,并注意,对于表中的四个选项({0, 0 => 0}、{0, 1 => 1}、{1, 0 => 1}、{1, 1, => 0})中的每一个选项,1s计数的奇偶校验。换句话说,如果输入有奇数的1s,输出也会有奇数的1s,反之亦然。
这个观察解释了观察结果的原因:XOR对两个数字加上N和M的集合位数,将产生一个与N+M具有相同的奇偶校验的数字。
发布于 2018-05-20 20:20:52
xor刚刚清除了常见的比特。不管设置了多少位,只要有多少位是常见的。
对于所有的比特,结果为零。由于没有共同的位,结果是集合位的和。
除非您还考虑到公共比特的均等,否则没有基于输入平价的结论。
https://stackoverflow.com/questions/50438913
复制相似问题