一组数据中,只有一个数只出现了一次,其余数字都是成对出现的,找出这个数字。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {1,2,3,4,4,5,3,2,1};
int sz = sizeof(arr)/sizeof(arr[0]);
int i = 0;
int ret = 0;
for(i=0; i<sz; i++)
{
ret ^= arr[i];
}
printf("%d\n",ret);
system("pause");
return 0;
}
进阶版本:
一个数组中只有两个数只出现了一次,其余数都是成对出现的,找出这两个数字。
int main()
{
int arr[] = {1,2,3,4,5,6,1,2,3,4};
int num1 = 0;
int num2 = 0;
int i = 0;
int pos = 0;
int ret = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
ret ^= arr[i]; //ret为数组中唯二的两个单独的数相异或得到的值
}
for(i=0; i<32; i++)
{
if(((ret>>i) & 1) == 1)
pos = i; //pos位为ret中值为1的最低位
}
for(i=0; i<sz; i++)
{
if(((arr[i] >> pos) & 1) == 1) //通过pos找到两个单独的数中的一个
num1 ^= arr[i];
}
num2 = ret ^ num1;
printf("%d %d\n",num1,num2);
system("pause");
return 0;
}
对数据的比特位的操作:
实现对一个8bit位数据的指定为的置0或者置1操作,并保证其他位不变。
#include <assert.h>
int bit_set(unsigned char *p_data,unsigned char pos,int flag)
//p_data 指定需要操作的数据; pos 指定位(1~8); flag 置0或者置1
{
unsigned char tmp = 0;
assert(p_data);
assert((pos >= 1) && (pos <= 8));
tmp = (1 << (pos-1));
if(flag == 0)
{
tmp = ~tmp;
*p_data &= tmp;
}
else
{
*p_data |= tmp;
}
return *p_data;
}
int main()
{
int num = 10;
int ret = bit_set(&num,3,1);
printf("%d\n",ret);
system("pause");
return 0;
}
使用位操作符的时候要注意它的优先级,避免错误的一个好习惯是选择带上括号。