异或是一个二元运算符 表示为 x^y
通过这个表,我们得出一些结论:
1)两个相同的十进制数异或的结果一定为零。
2)任何一个数和 0 的异或结果一定是它本身。
3)异或运算满足结合律和交换律。
异或的简单运用1:将一个二进制X的第4位如果为0设置为1,如果为1设置为0
int a = 101010 ^ 1000;
可以表示为 101010^1000=100010
X的每一位和Y的每一位做异或运算。参考上图表,如果双方都为1设置位1,如果双方都为0还=0;
异或的简单运用2:变量交换
private void Sawp(int a, int b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
异或的简单运用3:出现奇数次的数
输入N个数 其中一个数出现奇数次,另外的数出现偶数次,求这个出现奇数次的数、
private void Oddnuber(int[] args)
{
int ans = 0;
for (int i = 0; i < args.Length; i++)
{
ans = ans ^ args[i];
}
}
代码注解: 两个相同的数进行异或操作 结果位0。如果在一个数组内同一个数出现的次数为偶数
异或结果必定为0,如果0和出现奇数次的数异或,结果是其自身
异或简单运用3:
给你编码后的数组 encoded
和原数组 arr
的第一个元素 first
(arr[0]
)。
请解码返回原数组 arr
。
编码规则:encoded[i] = arr[i] XOR arr[i + 1]
。
private int[] result(int[] nueber, int InitV1)
{
int[] ruselt = new int[nueber.Length + 1];
ruselt[0] = InitV1;
for (int i = 1; i < nueber.Length + 1; i++)
{
ruselt[i] = nueber[i - 1] ^ ruselt[i - 1];
}
return ruselt;
}
首先一定要理解体意:
下列代码是将数组里的值进行加密操作
private int[] Decode(int[] Initnumbers)
{
int[] temp = new int[Initnumbers.Length - 1];
for (int i = 0; i < Initnumbers.Length - 1; i++)
{
temp[i] = Initnumbers[i] ^ Initnumbers[i + 1];
}
return temp;
}