java - 了解 Integer.highestOneBit() 方法实现背后的逻辑

标签 java bit

Java Integer 类有一个静态方法 highestOneBit 方法,它会在指定值中最高位的位置返回一个只有一位的值,如果指定值本身等于,则返回零零。

例如输入 int 17 将返回 16;由于 17 可以用二进制表示为 10001,因此它将返回最左边的位,即等于 16。

在 Integer 类中,它在 Java 文档中有以下实现。

    public static int highestOneBit(int i) {
    // HD, Figure 3-1
    i |= (i >>  1);
    i |= (i >>  2);
    i |= (i >>  4);
    i |= (i >>  8);
    i |= (i >> 16);
    return i - (i >>> 1);
}

我只想知道这样实现背后的逻辑以及使用移位操作背后的逻辑 .任何人都可以对此有所了解。

最佳答案

此算法计算给定的i,其二进制表示为:

0..01XXXXXXX...XXXX

值(value)

0..011111111...1111

这就是 5 个 |= 运算符所做的。

然后,在返回语句中,它从中减去右移一位的值

0..001111111...1111

得到结果

0..010000000...0000

它是如何工作的:

第 32(最左边)位可能的最高 1 位。假设输入数字的那个位是 1:

1XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

你或那个值右移 1 (i >> 1) 并得到

11XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

然后你或那个新值右移 2 (i >> 2) 得到

1111XXXX XXXXXXXX XXXXXXXX XXXXXXXX

然后你或那个新值右移 4 (i >> 4) 得到

11111111 XXXXXXXX XXXXXXXX XXXXXXXX

然后你或那个新值右移 8 (i >> 8) 得到

11111111 11111111 XXXXXXXX XXXXXXXX

最后你或那个新值右移 16 (i >> 16) 得到

11111111 11111111 11111111 11111111

如果最高 1 位小于第 32 位,这些操作仍然将其右侧的所有位都变为 1,并保持剩余(高位)为 0。

关于java - 了解 Integer.highestOneBit() 方法实现背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369498/

相关文章:

c - 我的二进制到十进制方法的无限循环错误?

JAVA:数字的存储?

java - 将选定的文件复制到项目目录

byte - 为什么字节存在?为什么我们不只使用位?

Java 代码执行意外的数字

java - Android:我的加密/解密不起作用,我得到奇怪的输出

C 整数数组,表示为转换为十进制的位

memory-management - 如何在 Rust 语言中以单个字节写入/读取 8 个 true/false

java - 抽象父类(super class)中静态变量的替代方案

java - 如何使用 JAXB 修改 XML 元素?