一、一个整数二进制中1的个数
优化1、
优化2、
二、判断一个整数是不是2的整数次方
三、输入两个整数m,n,计算需要改变m的二进制表示的多少位才可得到n
未完待续。。。
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; }
未完待续。。。
转载于:https://blog.51cto.com/zhujifang/1380188