java - Java 中的反转位 - O(n)

标签 java bit-manipulation reverse bit

我试图理解这段在 O(n) 时间内反转位的代码。我理解时间复杂度,但我无法理解这段代码背后的逻辑。

public static long reverse(long a) {
    long result = 0;
    int i = 31;
    while(a > 0){

        result += (a % 2) * Math.pow(2, i);
        i--;                        
        a = a/2;
    }
    return result;
}

为了简单起见,例如,如果我采用 12 (1100) 并且仅使用 4 位(设置 i = 3),那么我的输出将为 3 (0011)。我明白了,我也能够得出答案。

但是有人可以解释一下这段代码背后的逻辑吗?谢谢!

最佳答案

该代码是

  1. 破坏了一半可能的位模式(所有负数),并且
  2. O(n),而不是 O(log n),其中 n 是 a 中的位数
  3. 效率非常低
  4. 写得困惑

该算法仅适用于正数,并且:

extract the rightmost bit from a
set the corresponding bit from the left end
shift a one position to the right

它的重复长度为 a > 0 。如果 a 的值如果有一些前导零位,那么这个算法会比 O(n) 好一点。

尽管现代编译器应该能够转换a/2,但当掩码和移位速度更快时,位提取的余数和除法会导致效率低下。至a >> 1a%2a & 0x00000001 。但我不知道它是否会识别Math.pow(2, i)0x00000001 << i ;

关于java - Java 中的反转位 - O(n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38670747/

相关文章:

binary - 用按位运算替换最低有效位

c - 我的代码 : reversing words in a string? 的时间复杂度是多少 我应该考虑不对称间距吗?

c - 在没有库函数的情况下反转c中的字符串

java - Weblogic 10.3域解包问题

c++ - 为什么unsigned int右移总是填 '1'

c - 与 long 复制的位不同的两个 double 打印不同

c - 反转数组 C

java - 实现非阻塞线程安全列表

java - Reactive Java Subscription 是一个什么样的对象?

java - 从 Android Java 代码的 php Json 结果中删除结尾 [ 和 ]