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 内置字符串函数的内容。干杯!
您应该能够仅使用按位运算符和类型化数组来解决符号问题:
\n更新\n在 @bryc 注释后稍微更改rev函数的方法。由于具有“历史”目的的多个函数使得答案难以阅读,因此我将最新的代码放在第一位。\n但是,我保留了有关不同步骤的注释 \xe2\x80\x93 其余的可以是在编辑历史中找到。
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}\nRun Code Online (Sandbox Code Playgroud)\n这与您用其他语言编写的用于反转位的代码相同,这里唯一的区别是添加了类型化数组。
\n正如 @harold 在评论中指出的,零填充右移返回一个无符号(它是唯一这样做的按位运算符),因此我们可以省略类型化数组,只需>>> 0在return.
其实doing>>> 0就是常用来模拟ToUint32JS中的polyfilll;例如:
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;\nRun Code Online (Sandbox Code Playgroud)\n