1.编程实现两个int(32)位整数吗m和n的二进制表达中,有第多少个位不同?输入例子:1999 2299 则输出 7:
#include<stdio.h>
int main()
{
int a = 0,b = 0,end = 0;
int count = 0;
printf("请输入两个数字:\n");
scanf("%d%d",&a,&b);
end = a & b;
while(end)
{
count++;
end = end & (end - 1);
}
//用于求end中有多少个1
printf("共有%d个bit位不同!",count);
return 0;
}
2.编写函数:unsigned int reverse_bit(unsigned int value);这个函数返回: 值value的二进制位模式从左到右翻转后的值。如值 25: 00000000 00000000 00000000 00011001翻转后为:
2550136832:10011000 00000000 00000000 00000000 。
#include<stdio.h>
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
unsigned int ret = 0;
for(i=0;i<32;i++)
{
ret += ((value>>i) & 1)<<(31-i);
}
return ret;
}
int main()
{
unsigned int num = 0;
printf("请输入一个数:\n");
scnaf("%d",&num);
printf("%d翻转后的值为%d",num,reverse_bit(num));
return 0;
}
3.不使用(a+b)/2这种方式求两个数的平均值:
#include<stdio.h>
int main()
{
int a = 0,b = 0,avg = 0;
printf("请输入两个数:\n");
scnaf("%d%d",&a,&b);
avg = (a & b) + (a ^ b) >>1;
printf("这两个数的平均值为%d",avg);
return 0;
}
或者:
#include<stdio.h>
int main()
{
int a = 0,b = 0,avg = 0;
printf("请输入两个数:\n");
scnaf("%d%d",&a,&b);
avg = a - (a - b)>>1;
printf("这两个数的平均值为%d",avg);
return 0;
}4.一组数据中只有一个数字出现了一次,其它所有数字都是成对出现。请找出这个数字:
#include<stdio.h>
int main()
{
int arr[] = {1,1,22,22,3,44,44,55,55};
int i = 0,find = 0;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
find = find ^ arr[i];
}
printf("这个数是%d\n",find);
return 0;
}
本文出自 “练习水仙花数感悟” 博客,请务必保留此出处http://10704527.blog.51cto.com/10694527/1703782
原文:http://10704527.blog.51cto.com/10694527/1703782