【剑指offer】面试题10:二进制中1的个数
如果采用右移的话,负数右移会在前面补1,那么我们取出来的个数就会有问题,甚至如果我们用n作为bool值进行判断时就会陷入死循环。
那么,我们采用左移的方式: 解法一:
int NumberOf1(int n) { int count = 0; int temp = 1 << 31; for (int i = 0; i < 32; ++i)//最多左移31位 { if (n &temp) { ++count; } n = n << 1; } return count; }不过,我们可以采用另一种更好的方式,这是一种完全不同的思路 解法二:
int NumberOf1(int n) { int count = 0; while (n) { ++count; n = n&(n - 1); } return count; }举一反三: 把一个整数减去1之后在和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边中的一个1变成0。很多二进制的问题都可以用这个思路解决。
扩展: 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n. 我们可以分为两步解决这个问题:第一步求这两个数的异或,第二步统计异或结果1的个数。