1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
第一种方法:
#include<stdio.h>
#inculde<math.h>
unsigned int reverse_bit(unsigned int a)
{
int i =0;
unsigned int sum = 0;
for(i=0; i<32; i++)
{
sum += ((a>>i)&1)*pow(2.0,31-i); //把a>>i 右移i位,&1,判断是1还是0,然后给它乘以对应位置
}
return sum;
}
int main()
{
int num = 0;
unsigned int c = 0;
scanf("%d",&num);
c = reverse_bit(num);
printf("%u\n",c);
system("pause");
}
第二种方法:优化下
unsigned int reverse_bit(unsigned int a)
{
int i = 0;
unsigned int ret = 0;
for(i=0; i<32; i++)
{
ret<<=1;
ret |=(a>>i)&1; //通过|来保留 a的位是1 还是0
}
return ret;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h.>
int main()
{
int a = 10;
int b = 20;
//int average = a+((b-a)>>1); 平均值的求法,通过位操作实现
//10100
//11110
//01010
//10100
//int average = (a&b) + ((a^b)>>1);
printf("%d\n", average);
return 0;
}
3.
.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#inculde<stdio.h>
int search(int arr[],int sz)
{
int i = 0;
int ret = 0;
for(i=0; i<sz; i++)
{
ret =ret^arr[i]; //把所有结果都异或在一起
}
return ret;
}
int main()
{
int a = 0;
int arr[]={1,2,3,1,2};
int sz =sizeof(arr)/sizeof(arr[0]); //求数组长度,sizeof(arr),数组名单独放在sizeof里是整个数组字节的大小为5*4=20
a = search(arr,sz);
printf("%d\n",a);
system("pause");
}