在找到方法Long.numberOfLeadingZeros(long i)之前,我正在使用Math.getExponent(double d)将longs转换成双精度数.想法是找到long的双重表示,使用指数获得最高设置位,并从64减去它以获得前导零的数量.
这大部分都有效,但偶尔会被1关闭.以下for循环用于突出显示问题:
for (int i = 0; i < 64; i++) {
double max = Long.MAX_VALUE >>> i;
double min = Long.MIN_VALUE >>> i;
double neg = -1L >>> i;
System.out.format("Max: %-5d Min: %-5d -1: %-5d%n", Math.getExponent(dmax),
Math.getExponent(dmin), Math.getExponent(dneg));
}
Run Code Online (Sandbox Code Playgroud)
占产出的重要部分:
...
Max: 55 Min: 55 -1: 56
Max: 54 Min: 54 -1: 55
Max: 52 Min: 53 -1: 54
Max: 51 Min: 52 -1: 52
Max: 50 Min: 51 -1: 51 …
Run Code Online (Sandbox Code Playgroud)