1.编程实现:

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 

输入例子:

1999 2299

输出例子:7

int ce_bin_wei(){//unsigned int a=1999,b=2299; int a=1999,b=2299;int i=0;int sum=0;for(i=0;i<31;i++){sum+=(a&1)^(b&1);a>>=1;b>>=1;//a/=2;//b/=2;}return sum;}

==================================

//方法二

#include 
int count_one(int num){int count = 0;while (num){count++;num = num&(num - 1);//将二进制中从最低位出现的首个1变成零}return count;}int main(){int n1 = 0;int n2 = 0;scanf("%d%d", &n1, &n2);int num = n1^n2;int ret = count_one(num);printf("%d\n", ret);system("pause");return 0;}

2.编写函数:

unsigned int  reverse_bit(unsigned int value);

这个函数的返回 值value的二进制位模式从左到右翻转后的值。

如:

在32位机器上25这个值包含下列各位:

00000000000000000000000000011001

翻转后:(2550136832)

10011000000000000000000000000000

程序结果返回:

          2550136832

unsigned int reverse_bit(unsigned int value){unsigned int rev_val=0;int i=0;for(i=0;i<32;i++){rev_val<<=1;rev_val+=(value&1);value>>=1;}return rev_val;}

=============================================

另外一种

typedef unsigned int uint;uint reverse_bit(uint value){int i = 0;uint sum = 0;for (i = 0; i < 32; i++){sum += ((value >> i) & 1)*pow(2, 31 - i);}return sum;}

==============================================

3.不使用(a+b)/2这种方式,求两个数的平均值。

#include 
int main(){int num1 = 10;int num2 = 20;int avg = num1&num2 + (num1^num2) >> 1;

//方法1 num1&num2

//①先说相同位====== num1与num2二进制中 同一的保留下来形成两个相等的数a1 a2  这两个相等的数相加除以2 等于自己本

身 

//也就是 num1&num2 (如 num1=(1)十进制=(0001)这里简单表示,没有写全32位 num2=(3)十进制=(0011)二进制 )

// num1&num2=0001 (0001=(0001(num1中与num2相等的)+0001)/2) 

//②再说不同位====== (num1^num2) 两数不同位异或 (不会产生溢出 ) 右移一位 相当于除二 

//以上两步都不会产生溢出

//方法二 这种好理解 同样也没有溢出

//=====================int avg2 = num1 - (num1 - num2) / 2;===================

printf("%d\n", avg);

system("pause");

return 0;

}

4.一组数据中只有一个数字出现了一次。

其他所有数字都是成对出现的。请找出这个数字。(使用位运算)

int find_d(int arr[],int len){int i=0;int temp=0;for(i=0;i

//==================相同两数异或 结果为0

===============一群数字亦或 相当于消去其中相同的 最终结果为其中不同的数字异或的结果

5、【加强版】

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

[异或运算的性质:任何一个数字异或它自己都等于0 ]

[有了上面简单问题4的解决方案之后,我们回到原始的问题。如果能够把原数组分为两个子数组。在每个子数组中,包含一个只

出现一次的数字,而其他数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了

。 

我们还是从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都

出现了两次,在异或中全部抵消掉了。由于这两个数字肯定不一样,那么这个异或结果肯定不为0,也就是说在这个结果数字的

二进制表示中至少就有一位为1。我们在结果数字中找到第一个为1的位的位置,记为第N位。现在我们以第N位是不是1为标准把

原数组中的数字分成两个子数组,第一个子数组中每个数字的第N位都为1,而第二个子数组的每个数字的第N位都为0。(这两个

数字不同,意味着为1的那个位是相异的) 

]

#include 
//#include 
int main(){int arr[] = {2,2,3,3,-1,5};int i = 0; int result = 0;int num1=0;int num2=0;int count=0;int len=sizeof(arr) / sizeof(arr[0]);for (i = 0; i < len; i++){result^= arr[i];//异或结束相当于两个数异或的结果}//找出这两个数的第一个相异位置 count=1;i=1;  while(result){  if((result&i)==1){  break;  }  result>>=1;  count<<=1;  }  //按照这个位置把数组分成两组  num1 = 0;  num2 = 0;  for(i=0;i

5参考自http://z466459262.iteye.com/blog/1125518