算法一:时间复杂度O(n)
预备知识:
十进制的二进制形式与1进行与运算,若结果为1,则二进制的最后一位是1,若结果为0,则二进制的最后一位是0.
原因:1的二进制前面全为0,只有最后一位为1,所以任何数跟1进行与运算,除了最后一位不一定为0,其他高位全部为0.例如:7(111) 跟 1(001)进行与运算结果为1(001);6(110)跟1进行与运算结果0(000);
算法思路:
将数的二进制跟1进行与运算,若结果为1说明数的最后一位为1,计数器加一,然后将数的二进制右移一位(即舍弃最低位),然后继续循环跟1进行与运算直到该数变为0,则统计出来数的二进制中有几个1。算法复杂度为数的二进制位数,int类型最多32位。
注意:右移的时候需要用无符号右移>>>,不能用有符号位移>>,因为有符号位移时,如果是负数会在高位补1,正数在高位补0,而无符号位移不管是正数还是符数都在高位补0.这个运算符好像只有java有,C++没有,所以C+