剑指offer编程-二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
1.数字在计算机中本身为2进制存储,则每次判断数字末尾是不是1(与1相与),若为1计数加一,然后把数字右移一位,不断重复,直至为零。----会造成死循环,考虑负数的情况,右移后左边位补充1。
**虽然右移操作和除2等价,但是除法运算的效率比移位运算低的多。
2.数字不移位,先用1和数字相与,判断最后一位,然后将1左移一位与数字相与,判断倒数第二位。直至左移后为0。----整型有多少位就需要左移多少次(int 32位需要左移32次)。
3.把整数减去1,再于原来的整数做与运算 《==》把该整数最右边的1变为0。 。 ==》 整数中有多少个1,就能进行多少次这样的操作。
int NumberOf1(int n) { int count=0; while(n){ ++count; n = (n-1)&n; } return count; }
测试用例
- 正数(包括边界值1,0x7FFFFFFF)
- 负数(包括边界值0x8000000,0xFFFFFFFF)
- 0
相似题目
- 用一条语句判断一个数是不是2的整数次幂:二进制表示中只有一位为1的数是2的整数次幂。则将该整数减去1的结果和该整数本身做与运算,会得到0。
- 输入两个整数m n,需要改变m的二进制表示中的多少位才能得到n:第一步,将两数做异或运算。第二步,统计异或结果中1的个数。

浙公网安备 33010602011771号