例如:
应用一:
int a = 3 , b = 5;
求不允许创建临时变量,使用按位异或操作符,交换两个整数的内容
首先,我们要知道 ^ 有一个特点,那就是 a ^ a = 0 以及 a ^ 0 = a
所以题目的要求可以使用以下代码解决:
a = a ^ b; - a = 3^5
b = a ^ b; - b = a ^ b ^ b = 3 ^ 5 ^ 5 = 3 ^ 0 = 3 - b = 3
a = a ^ b; - a = a ^ b = 3 ^ 5 ^ 3 = 3 ^ 3 ^ 5 = 0 ^ 5 = 5 - a = 5
通过以上的运算,我们又得知 ^ 和数学符号 乘号× 一样 具有交换律的特点
应用二:
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。请实现函数:
int singleNumber(int nums[], int numsSize),找出那个只出现一次的元素。
int singleNumber(int nums[], int numsSize)
{
int k = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
k = k ^ nums[i];
//0^4^1^2^1^2 = 0^4^0^0 = 0^4 = 4 利用了^的特性,也就是 a ^ a = 0 和 0 ^ a = a
}
return k;
}
int main()
{
int nums[] = { 4,1,2,1,2 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int ret = singleNumber(nums,numsSize);
printf("%d",ret);
return 0;
}
注意,这种异或操作是有局限性:
1.只能作用于整数交换
2.代码的可读性差
3.代码执行的效率也是低于使用第3个变量的方法