反转位 JavaScript

kus*_*lvm 1 javascript bit-manipulation bit-shift

这个问题是标准的,但 JavaScript 中的解决方案需要花费更多的精力来编写代码。

我得到了解决方案,但我的答案只有所需的一半。

问题描述

反转 32 位无符号整数 A 的位。

问题约束

0 <= A <= 2^32

输入格式

输入的第一个也是唯一的参数包含一个整数 A。

输出格式

返回表示最小异或值的单个无符号整数。

输入示例

Input 1:
0
Input 2:
3
Run Code Online (Sandbox Code Playgroud)

示例输出

Output 1:
0
Output 2:
3221225472
Run Code Online (Sandbox Code Playgroud)

我的解决方案


function modulo(a, b) {
        return a - Math.floor(a/b)*b;
}
function ToUint32(x) {
    return modulo(parseInt(x), Math.pow(2, 32));
}
function revereBits(A){
    A = A.toString(2);
    while (A.length < 31){
        A = "0"+A;
    }
    var reverse = 0;
    var NO_OF_BITS = A.length;
    for(var i = NO_OF_BITS; i >= 1; i--){
        var temp = (parseInt(A, 2) & (1 << i - 1));
        if(temp){
            reverse |= 1 << (NO_OF_BITS - i);

        }
    } 
    if( reverse << 1 < 0 ) reverse = ToUint32(reverse << 1);
    return reverse;

}
Run Code Online (Sandbox Code Playgroud)

现在,在行中

 if( reverse << 1 < 0 ) reverse = ToUint32(reverse << 1);
Run Code Online (Sandbox Code Playgroud)

你看我必须把答案加倍。然而,我无法理解为什么需要这样做。

我采用了https://www.geeksforgeeks.org/write-an-efficient-c-program-to-reverse-bits-of-a-number/的方法

不得不对其进行一些调整。例如,运行从 31 到 1 的循环,而不是从 0 到 31。对于 i = 0 本身,后者在第一次左移操作中给出负值。

有人可以帮助解决这个解决方案并指出其中的问题吗?

更新 - 问题与位操作有关。所以,伙计们,请不要回答或评论任何包含 Javascript 内置字符串函数的内容。干杯!

ZER*_*ER0 7

您应该能够仅使用按位运算符和类型化数组来解决符号问题:

\n

更新\n在 @bryc 注释后稍微更改rev函数的方法。由于具有“历史”目的的多个函数使得答案难以阅读,因此我将最新的代码放在第一位。\n但是,我保留了有关不同步骤的注释 \xe2\x80\x93 其余的可以是在编辑历史中找到。

\n
function rev(x) {\n    x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);\n    x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);\n    x = ((x >> 4) & 0x0F0F0F0F) | ((x & 0x0F0F0F0F) << 4);\n    x = ((x >> 8) & 0x00FF00FF) | ((x & 0x00FF00FF) << 8);\n    x = (x >>> 16) | (x << 16);\n\n    return x >>> 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这与您用其他语言编写的用于反转位的代码相同,这里唯一的区别是添加了类型化数组。

\n

正如 @harold 在评论中指出的,零填充右移返回一个无符号(它是唯一这样做的按位运算符),因此我们可以省略类型化数组,只需>>> 0return.

\n

其实doing>>> 0就是常用来模拟ToUint32JS中的polyfilll;例如:

\n

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

\n
    // 2. Let lenValue be the result of calling the Get internal method\n    //    of O with the argument "length".\n    // 3. Let len be ToUint32(lenValue).\n    var len = O.length >>> 0;\n
Run Code Online (Sandbox Code Playgroud)\n

  • 好吧,我的意思是 `(x &amp; 0xFFFF0000) &gt;&gt; 16` 等,这些移位不应该是 `&gt;&gt;&gt;` 变体,以避免符号位散布到各处吗? (2认同)