HJ86 求最大连续bit数
法一
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String str = Integer.toBinaryString(num);
int temp = 0;
int max = 0;
for (char ch : str.toCharArray()) {
if (ch == '1') {
temp++;
} else {
temp = 0;
}
max = Math.max(max, temp);
}
System.out.println(max);
}
}
法二
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int count = 0, max = 0;
while (num != 0) {
if ((num & 1) == 1) {
count++;
} else {
count = 0;
}
num >>>= 1;
max = Math.max(count, max);
}
System.out.println(max);
}
}
知识点
i&1运算是如何进行?
i&1 代表按位与运算,取 2进制整数 i 的最低位,如果最低位是1 则得1,如果最低位是0 则得0。 奇数 i 的最低位 是1,偶数i 的最低位 是0。
i 2进制 &1
0 0000 0000 &1 得0 偶数
1 0000 0001 &1 得1 奇数
2 0000 0010 &1 得0 偶数
3 0000 0011 &1 得1 奇数
4 0000 0100 &1 得0 偶数
无符号右移>>>
计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负
1.有符号右移>>(若正数,高位补0,负数,高位补1)
正数:例如
4>>2
首先写出4的二进制数,因为是正数所以最高位为0,也就是第一个
0000 0000 0000 0000 0000 0000 0000 0100
右移两位得到(高位补0)
000000 0000 0000 0000 0000 0000 0000 01
结果为:1
右移n位也就是4 /(2^n)
负数:例如
-4>>2
(高位补1)
首先写出-4的二进制数,因为是负数所以最高位为1
1000 0000 0000 0000 0000 0000 0000 0100
然后写出-4补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)
1111 1111 1111 1111 1111 1111 1111 1100(补码)
右移2位: 在高位补1
1111 1111 1111 1111 1111 1111 1111 1111
根据补码写出原码才是我们所求的结果, 保留符号位,然后按位取反再加上1
100000 0000 0000 0000 0000 0000 0000 00(取反后的结果)
100000 0000 0000 0000 0000 0000 0000 01(再加1)
结果为:-1
2:无符号右移>>>(不论正负,高位均补0)
正数:例如4>>>2
与4>>2的运算相同,结果也为1
负数:例如-4>>>2
首先写出-4的二进制数,因为是负数所以最高位为1
1000 0000 0000 0000 0000 0000 0000 0100
然后写出-4补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)
1111 1111 1111 1111 1111 1111 1111 1100(补码)
右移2位: 在高位补0
0011 1111 1111 1111 1111 1111 1111 1111
结果为:1073741823