一、一个整数二进制中1的个数

1、可能引起死循环的解法

int NumberOf1(int n) {     int count = 0;     while (n)	// 如果n为负数,则n会不断增大到0XFFFFFFF形成死循环     {         if (n & 1)             ++ count;          n = n >> 1;     }              return count; } 

优化1、

int NumberOf1(int n) {     int count = 0;     unsigned int flag = 1;      while (flag)     {         if (n & flag)             ++ count;          flag = flag << 1;// flag的1的位置不断左移,逐步判断n的位置     }          return count; } 

优化2、

/* 公式1:将一个整数减1之后再和原数进行位与运算,相当与将该数的二进制表示的最右一位1变成0 */ int NumberOf1(int n) {     int count = 0;      while (n)     {         ++ count;          n = n & (n - 1);     }             return count; } 

二、判断一个整数是不是2的整数次方

// 如果一个整数是2的整数次方,则该数的二进制表示中只含有一个1,则用公式1,即可得到结果 bool IsOrNot(int n) {     if ((n & (n-1)) == 0)         return true;      return false; } 

三、输入两个整数m,n,计算需要改变m的二进制表示的多少位才可得到n

/* 解法: 	1、首先将m与n进行异或运算 	2、对步骤1的结果进行统计1出现的次数,即为m与n相差的位数,即可的得到结果 */ int DefMN(int m,int n) {     int count = 0;      m = m ^ n;     while (m)     {         ++ count;         m = m & (m -1);     }      return count; } 

未完待续。。。