找出只出现一次的数字
按位与 | a & b | 两个操作数对应位同为1时,结果为1,其余全为0 |
按位或 | a | b | 两个操作数对应位同为0时,结果为0,其余全为1 |
按位异或 | a ^ b | 两个操作数对应位相同时,结果为0,不同时,结果为1 |
按位取反 | ~a | 每个操作数对应位取反即可 |
左移 | a << b | 将一个操作数的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0) |
右移 | a>> b | 将一个操作数的各二进制位全部右移若干位(右边的二进制位丢弃,正数左补0,负数左补1) |
void Find(int arr[], int sz)
{
//1.把所有数字异或
int i = 0;
int ret = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
//2.计算ret哪一位为1
//ret = 3
//011
int pos = 0;
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1) == 1)
{
pos = i;
break;
}
}
//把从低位向高位的第pos位为1 , 为0的放在另一个分组
int num1 = 0;
int num2 = 0;
for (i = 0; i < sz; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
num1 ^= arr[i];
}
else
{
num2 ^= arr[i];
}
}
printf("%d %d\n", num1, num2);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
Find(arr, sz);
return 0;
}
偶数奇数位互换
int main()
{
int num = 10;
int ret = ((num & 0xaaaaaaaa) >> 1) + ((num & 0x55555555) << 1);
int a = SWAP(num);
printf("%d\n", ret);
printf("%d\n", a);
return 0;
}