我通过在C ++中测试发现了一个观察结果。
观察是,
1)如果两个数字中的两个数字都具有奇数设置位数,则其XOR将具有偶数设置位数。
2)如果两个数字中的两个数字都具有偶数设置位数,则其XOR将具有偶数设置位数。
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个零
如果对理解代码有疑问,请在评论中告诉我。
答案 0 :(得分:3)
这种行为反映了一个易于证明的算术事实:
有了这个事实,请考虑XOR
的真值表,并注意表格中的四个选项中的每一个({0, 0 => 0}
,{0, 1 => 1}
,{1, 0 => 1}
,{1, 1, => 0}
)1
的计数的奇数/偶数奇偶校验保持不变。换句话说,如果输入具有奇数个1
s,则输出也将具有奇数个1
s,反之亦然。
这个观察结果解释了为什么你观察到结果:XOR
两个带有N
和M
设定位数的数字将产生一个具有相同奇数/偶数奇偶校验的数字为N+M
。
答案 1 :(得分:1)
感谢所有试图回答的人。
我们可以提供这样的证据,
假设N是第一个数字中的设置位数,M是第二个数字中设置的位数。
然后将这两个数字的XOR中的位设置为N + M-2(Δ)其中,delta是两个数字都设置为位的位位置的总数。现在这个表达式解释了每一件事。
偶数+奇数 - 偶数=奇数
奇数+奇数 - 偶数=偶数
甚至+偶数 - 偶数=偶数
答案 2 :(得分:0)
xor只是清除公共位。设置多少位并不重要,只需要多少位。
如果所有位都相同,则结果为零。没有共同的位,结果是设置位的总和。
除非你考虑公共位的奇偶校验,否则没有基于输入奇偶性的结论。
答案 3 :(得分:0)
一个可能的证明是基于 xor 是一个交换运算符的观察,所以 (x 的 xor 数字) xor (y 的 xor 数字) = (x xor y) 的数字的 xor