1.编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#include <stdio.h>
#include<stdlib.h>
int count_diff_bit(int m, int n)
{
int num = m^n;
int count = 0;
while(num)
{
count++;
num = num&(num-1);
}
return count;
}
int main()
{
int num1 = 0;
int num2 = 0;
int ret = 0;
while (1)
{
printf("请输入你要检测的两个数:\n");
scanf("%d%d", &num1, &num2);
ret = count_diff_bit(num1, num2);
printf("%d", ret);
}
system("pause");
return 0;
}
2.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832。。)
10011000000000000000000000000000
程序结果返回:
2550136832
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int value)
{
unsigned int m = 0;
int i = 0;
for (i = 0; i < 32-1; i++)
{
m |= value & 1;
m <<= 1;
value >>= 1;
}
return (unsigned int)m;
}
int main()
{
unsigned int num =0 ;
unsigned int ret = 0;
scanf("%u", &num);
ret = reverse_bit(num);
printf("%u", ret);
system("pause");
return 0;
}
3.不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h>
#include<stdlib.h>
int Average_value(const int num1, const int num2)
{
int a = num1;
int b = num2;
int aver = 0;
/*aver = a + (b - a) / 2;*/
aver = (a&b) + ((a^b) >> 1);
return aver;
}
int main()
{
int num1 = 0;
int num2 = 0;
int ret;
printf("请输入你所要求平均值的两个数:");
scanf("%d%d", &num1, &num2);
ret = Average_value(num1, num2);
printf("%d", ret);
system("pause");
return 0;
}
4.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int search(int arr[], int sz)
{
int i = 0;
int m = 0;
for (i=0; i<sz; i++)
{
m^= arr[i];
}
return m;
}
int main()
{
int ret = 0;
int arr[] = {1,2,3,2,1,4,4,6,6};
int sz = sizeof(arr) / sizeof(arr[0]);
ret = search(arr, sz);
printf("%d", ret);
system("pause");
return 0;
}
交换二进制的奇数位和偶数位
例如: 00001010
变成00000101
和前面翻转二进制数其实差不多,我们可以将二进制的从最高位到最低位依次求出,也就是sum,同样的ret如果左移32次的话,就会将最高位丢失,所以让ret=0,先无用的左移一次也就是把ret=ret<<1放到赋值前面,移位并求出最高位的值后,我们就让第31位给到ret的最低位,然后再左移,再让第32位给到最低位。总共执行16次就可以将所有的二进制奇数位和偶数位互换。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int exchange(int val)
{
int sum = 0;
int ret = 0;
int i = 0;
for (i = 16; i > 0; i--)
{
ret = ret << 1;
sum = (val >> (2 * i - 2) & 1);
ret = sum | ret;
ret = ret << 1;
sum = (val >> (2 * i - 1) & 1);
ret = ret | sum;
}
return ret;
}
int main()
{
int val = 14;
int num = EX(val);
printf("%d", num);
system("pause");
return 0;
}