- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是 Long.java 中的 numberOfLeadingZeros(long i) :
public static int numberOfLeadingZeros(long i) {
// HD, Figure 5-6
if (i == 0)
return 64;
int n = 1;
int x = (int)(i >>> 32);
if (x == 0) { n += 32; x = (int)i; }
if (x >>> 16 == 0) { n += 16; x <<= 16; }
if (x >>> 24 == 0) { n += 8; x <<= 8; }
if (x >>> 28 == 0) { n += 4; x <<= 4; }
if (x >>> 30 == 0) { n += 2; x <<= 2; }
n -= x >>> 31;
return n;
}
作者说它是基于floor(log2(x)) = 63 - numberOfLeadingZeros(x)或ceil(log2(x)) = 64 - numberOfLeadingZeros(x - 1),是真的吗?还是我太笨了,听不懂?
谁能给我解释一下吗?谢谢!
最佳答案
一个数字的位数是 floor(log(num)) + 1
(log 的基数正确。)如果总数字空间为 x,则前导零的数量为
x - (floor(log(num)) + 1) =
(x - 1) - floor(log(num))
所以在你的例子中,共有 64 位数字和二进制数
leadingZeros(num) = 63 - floor(log_2(num))
编辑:
>>>
是 Java 中的无符号右移运算符, <<
是左移。 n >>> 32
将转移n
向右移动 32 位,同时用 0 填充空白。
所以算法的工作原理如下:
0000000000000000000000000000000000000000000001011010100000101011
类次i
向右 32 位,所以 x
仅包含高 32 位。
00000000000000000000000000000000
如果 (a) 这是 0,我们知道高 32 位是 0,因此将 32 添加到前导零计数并集中于低 32 位。 (b) 否则,该值不为零,因此该数字的前导零少于 32 个。重点关注高 32 位。
类次x
向右移动 16 位。
0000000000000101
通过相同的过程: (a) 如果这是 0,则将 16 添加到前导零计数并集中于下一个最低 16 位(通过将它们左移到我们正在工作的区域中。) (b) 如果这是非零的,那么我们需要添加的前导零少于 16 个。
对下一个字节重复此操作,然后是接下来的 4 位、2 位和最后一位。
关于java - 我不认为Long.java中的numberOfLeadingZeros(long i)是基于floor(log2(x)) = 63 - numberOfLeadingZeros(x)!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543410/
这是 Long.java 中的 numberOfLeadingZeros(long i) : public static int numberOfLeadingZeros(long i) {
我是一名优秀的程序员,十分优秀!