NodeJS中偶数错误输出的十进制到二进制转换

Decimal to Binary conversion for even numbers wrong output in NodeJS

我有以下代码将 DEC 转换为 BIN,然后将其反转,然后再转换回 DEC。

当我传递奇数时,我得到的结果是正确的,但对于偶数,结果不准确。

谁能帮我看看我做错了什么?

  function mirror_bits(n) {
        var NumFromInvNum = parseInt(n.toString(2).split("").reverse().join(""), 2);
         return NumFromInvNum;
    }
console.log(mirror_bits(2031768448)); 
console.log(mirror_bits(3105510272)); 
console.log(mirror_bits(622482304)); 
console.log(mirror_bits(3357168512));

我看到的示例值是

输入 = 2031768448 |预期输出 = 30038174 -- 不工作

输入 = 3105510272 |预期输出 = 30038173 -- 工作

输入 = 622482304 |预期输出 = 30038180 -- 不工作

输入 = 3357168512 |预期输出 = 30038035 -- 工作

输入 = 1562006400 |预期输出 = 30038202-- 不工作

输入 = 3709490048 |预期输出 = 30038203-- 不工作

我没有发现代码有任何问题。也许如果您跟踪流程的每个转换,您就可以找到为什么会得到意外的输出?

奇数总是有一个 1 作为它们的最低有效位。这意味着,如果反转,1 将成为最重要的位。根据位数,这个前导 1 可以解释为带符号的位。我在下面的输出中没有看到任何负数。

此外,对于上面的奇数,您的预期输出是多少?

在下面的代码片段中,我 return 一个具有十进制、二进制、反向二进制和反向十进制值的对象。

更新 1

查看更新后的问题后,您的输入没有产生预期的输出。对齐二进制数字后,看起来您正在向左移动 1-2 位数字并用 0 填充最低有效位。我不确定您为什么期望上述输出?

const mirrorBits = (dec) => {
  const bin = dec.toString(2);
  const binRev = bin.split('').reverse().join('');
  const decRev = parseInt(binRev, 2);
  return { dec, decRev, bin, binRev };
};

console.log(mirrorBits(2031768448)); // See #1 ~ 15019087
console.log(mirrorBits(3105510272)); // 30038173
console.log(mirrorBits(622482304));  // See #3 ~ 7509545
console.log(mirrorBits(3357168512)); // 30038035
.as-console-wrapper { top: 0; max-height: 100% !important; }
<!--

in = 2031768448 | expected = 30038174 -- not working
in = 3105510272 | expected = 30038173 -- working
in = 622482304  | expected = 30038180 -- not working
in = 3357168512 | expected = 30038035 -- working


#1
Actual    : 0000000111001010010110001001111  (15019087)
Expected? :        1110010100101100010011110 (30038174) << 1

#3
Actual    : 000000011100101001011000101001   (7509545)
Expected? :        1110010100101100010100100 (30038180) << 2

-->

更新 2

您需要在反转之前用零填充(32 位;又名 4 字节整数)您的原始二进制值。

dec.toString(2).padStart(32, '0');

const mirrorBits = (dec) => {
  const bin = dec.toString(2).padStart(32, '0');
  const binRev = bin.split('').reverse().join('');
  const decRev = parseInt(binRev, 2);
  return { dec, decRev, bin, binRev };
};

console.log(mirrorBits(2031768448)); // 30038174
console.log(mirrorBits(3105510272)); // 30038173
console.log(mirrorBits(622482304));  // 30038180
console.log(mirrorBits(3357168512)); // 30038035
console.log(mirrorBits(1562006400)); // 30038202
console.log(mirrorBits(3709490048)); // 30038203
.as-console-wrapper { top: 0; max-height: 100% !important; }

此外,您可以使用在线号码转换器,例如RapidTables - Binary to Decimal converter 比较您的结果。