Day18 2023/01/25
难度:简单
题目
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:231<=n<=231−12^{31}<=n<=2^{31}−1231<=n<=231−1
即范围为:−2147483648<=n<=2147483647−2147483648<=n<=2147483647−2147483648<=n<=2147483647
示例
输入:10
返回值:2
说明:十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
复制代码
思路一
遍历整数n二进制的每一位,如果为 1 则计数器加1,最后返回计数器。其中通过移位运算实现遍历每一位,通过按位与运算确定该位是否为1。 具体做法:
- 遍历二进制的32位,通过向左移位运算。
- 将移位后的1与数字n进行按位与运算,结果不为0,计数器就加1。
static void print(int num){
int count = 0;
for (int i = 31;i >= 0;i--){
count += (num & (1 << i)) == 0 ? 0 : 1;
}
System.out.println(count);
}
新学会的把一个数的二进制全打出来
static void printBinary(int num){
for (int i = 31;i >= 0;i--){
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}