分享几道遇到的有关位运算的题
1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
int sum = 0;
int b = 0;
for (i=0; i<32; i++)
{
b = ((value>>i)&1)*pow(2,31-i);
sum += b;
}
return sum;
}
int main()
{
int a = 25;
int ret = 0;
ret = reverse_bit(a);
printf("%u\n", ret);//此处一定要用%u而不是%d的,因为若最高位为1,ret代表的是有符号数,其结果为负数
return 0;}
2.不使用(a+b)/2这种方式,求两个数的平均值。
法一:
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d%d", &num1, &num2);
int avg = num1 - (num1 - num2) / 2;
printf("%d", avg);
return 0;
}
法二:
int Average(int a,int b)//两数的平均数
{
return (((a&b)) + (a^b)>>1);
}
或者变式求两数的和:
int Sum(int a,int b)//求两数和
{
return (((a&b)<<1) + (a^b));
}
3.编程实现:
一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
int main()
{
int arr[] = { 1, 5, 5, 1, 7, 6, 7, 8, 8,9,9};
int i = 0;
int len = sizeof(arr) / sizeof(arr[0]);
for (i = 1; i < len; i++)
{
arr[0] = arr[0] ^ arr[i];//^异或运算符,相异为1相同为0.可看上一篇运算符理解
}
printf("%d", arr[0]);
return 0;
}
4.a,b,c,三个数,
如果 ···········返回
a > b············· 1
a == b ···········0
a < b ············-1
不能用 if for > <操作符
int Max(int a,int b)
{
return ((a-b)>>31) ? -1 : (a-b ? 1 : 0);
}
数字在计算机中以32位储存,最前一位为符号位,正数为0,负数为1;
判断式中1为真,0为假。
第一次三目运算完成后,后面的判断只剩 > 和 = ;同理可返回相应值。