题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
A1:判断数num的最右边一位是不是1,每次右移1位,直到数num变为0 ====> 要区分正数情况和负数情况,正数右移补0,负数右移补1
A2:避免死循环,不选择右移数num,而是左移flag ====> 循环次数比较大,32位整数需要循环32次
A3:把数num减去1,再和原整数做位与运算。一个整数的二进制中有多少个1就可以进行多少次这样的运算
//数num右移,正数补0,负数补1
(1)Q1:可不可以把右移一位改成除以2?
A1:不可以,除法的效率比移位要低很多,实际编程中应尽可能用移位运算符代替乘除法
(2)A2:把负数0x80000000右移1位是0xC0000000
//左移flag
class Solution { public: int NumberOf1(int n) { int count = 0; unsigned int flag = 1; while(flag) { if(n & flag) { count++; } flag = flag << 1; } return count; } };
//有几个1就运算几次(减+位与)
class Solution { public: int NumberOf1(int n) { int count = 0; while(n) { n = (n - 1) & n; count++; } return count; } };
相关题目:
进制转换:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出
bit count:输入一个long类型的数值, 求该数值的二进制表示中的1的个数
UTF-8编码验证:给定一个表示数据的整数数组,返回它是否为有效的 utf-8 编码