一、题目:求二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例如:10 二进制表示为:1010 ,该函数输出二
二、最初思路:
先检查二进制位最右边一位是否为1,将二进制位右移一位,这时最右边一位
变为原来的倒数第二位,再右移一位,依次循环运算,直到此数变为0。
怎样检查二进制位最右边一位是否为1呢?用这个数&1,若结果为0,则是0,否则为1。
三、改进:
1.输入的数为负数,最高位为1,右移时最高位会填充1,用上述方法则会死循环。
思路应修改为:先&1判断最右边一位是否为1,然后将1左移一位再&判断右边第二位
是否为1,与运算的结果为0,则该位不是1,否则都为1。直到1左移为0结束循环.
2.上述思路32位整数需要移动32次,改进为整数中有多少个1就循环多少次。
思路应修改为:将一个整数减去1然后与这个整数做与运算,结果恰好将最右边的1变为0。
例:最低位为1:(1001)&(1000)= 1000
最低位为0: