利用位操作
来源:互联网 发布:免费票据打印软件 编辑:程序博客网 时间:2024/05/16 19:54
#include <iostream>
int FindNumber(int a[], int n)
{
int bits[32];
int i, j;
// 累加数组中所有数字的二进制位,一个int类型占4个字节,故用大小为32的数组表示
memset(bits, 0, 32 * sizeof(int));
for (i = 0; i < n; i++)
for (j = 0; j < 32; j++)
bits[j] += ((a[i] >> j) & 1);
// 如果某位上的结果不能被整除,则肯定目标数字在这一位上为
int result = 0;
for (j = 0; j < 32; j++)
if (bits[j] % 3 != 0)
result += (1 << j);
return result;
}
int main()
{
const int max = 10;
int a[max] = { 2, 3, 1, 2, 3, 4, 1, 2, 3, 1 };
printf("%d\n", FindNumber(a, max));
return 0;
}
比如int a[] = {1, 1, 3, 5, 2, 2}
整个数组异或的结果为3^5即 0x0011 ^ 0x0101 = 0x0110
对0x0110,第1位(由低向高,从0开始)就是1。因此整个数组根据第1位是0还是1分成两组。
a[0] =1 0x0001 第一组
a[1] =1 0x0001 第一组
a[2] =3 0x0011 第二组
a[3] =5 0x0101 第一组
a[4] =2 0x0010 第二组
a[5] =2 0x0010 第二组
第一组有{1, 1, 5},第二组有{3, 2, 3},明显对这二组分别执行“异或”解法就可以得到5和3了。
#include <iostream>
void FindTwoNotRepeatNumberInArray(int *a, int n, int *pN1, int *pN2)
{
int i, j, temp;
//计算这两个数的异或结果
temp = 0;
for (i = 0; i < n; i++)
temp ^= a[i];
// 找第一个为1的位
for (j = 0; j < sizeof(int)* 8; j++)
if (((temp >> j) & 1) == 1)
break;
// 第j位为1,说明这两个数字在第j位上是不相同的
// 由此分组即可
*pN1 = 0, *pN2 = 0;
for (i = 0; i < n; i++)
if (((a[i] >> j) & 1) == 0)
*pN1 ^= a[i];
else
*pN2 ^= a[i];
}
void PrintfArray(int a[], int n)
{
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
putchar('\n');
}
int main()
{
const int MAXN = 10;
int a[MAXN] = { 1, 2, 3, 4, 1, 2, 3, 4, 0, 5 };
printf("数组为: \n");
PrintfArray(a, MAXN);
int nNotRepeatNumber1, nNotRepeatNumber2;
FindTwoNotRepeatNumberInArray(a, MAXN, &nNotRepeatNumber1, &nNotRepeatNumber2);
printf("两个不重复的数字分别为: %d %d\n", nNotRepeatNumber1, nNotRepeatNumber2);
return 0;
}
- 利用位操作
- 利用位操作来进行状态操作
- 利用SQL语句完成位操作
- 利用bitand实现多种位操作
- 利用位操作实现简单的功能
- 利用位运算进行循环移位操作
- 利用位操作符求平均值
- 利用位操作对英文字母除重
- 【C】【不完全利用位操作完成内存值操作】
- 利用JS实现为数字添加千分位的操作
- 利用位操作符实现两个整数的交换
- 利用JS实现为数字添加千分位的操作
- C语言中利用共用体、结构体、位域实现位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 位操作
- 常州隆胸整形有哪些医院
- 2复合
- adobe acrobat 无效批注对象
- 相关运算(correlation filter)与 imfilter
- hdu 2850——Load Balancing
- 利用位操作
- Java泛型理解
- android SDK修改默认壁纸
- Java GC基本算法
- Android开发的一些细节
- 认知大数据之初
- 无线充电技术介绍之二(不能不懂的电池技术知识)【无线充电圈 技术分析】
- 常州隆胸整形医院哪家好
- 添加用户为sudoer