标签:位运算
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