二进制中1的个数
知识点
1、java位运算
符号 | 介绍 |
---|---|
>> | 右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,若为正数则高位补0,若为负数则高位补1 |
<< | 左移运算符,符号左侧数值 按位左移 符号右侧数值指定的位数,并在低位处补0 |
>>> | 无符号右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,无论正负高位补0 |
& | 与(AND)运算符,对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0 |
| | 或(OR)运算符,对两个整型操作数中对应位执行布尔代数,两个位中只要有一个为1就输出1,否则为0 |
^ | 异或(XOR)运算符,对两个整型操作数中对应位执行布尔代数,两个位相等则为0,不相等则为1 |
~ | 非(NOT)运算符,按位取反运算符翻转操作数的每一位,即0变成1,1变成0 |
2、java十进制转二进制
- 使用位运算
public static void binaryToDecimal(int n){
for(int i = 31;i >= 0; i--)
System.out.print(n >>> i & 1);
}
java的基本数据类型是固定的,int类型4个字节,32位,最高位是符号位,使用>>>
- 转成字符串
String result = Integer.toBinaryString(n);
System.out.println(result);
代码实现
java其实提供了直接解决这道题的API
但是感觉这种抖机灵的方法不可取,可以看一下底层源码
内置函数Integer.bitCount()
源码如下:
@HotSpotIntrinsicCandidate
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
我的解法
public static int hammingWeight(int n) {
int res=0;
for(int i = 31;i >= 0; i--){
if ((n>>>i&1)==1)
res++;
// System.out.print(n >>> i & 1);
}
// System.out.println();
return res;
}