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

Posted

技术标签:

【中文标题】NodeJS中偶数错误输出的十进制到二进制转换【英文标题】:Decimal to Binary conversion for even numbers wrong output in NodeJS 【发布时间】:2022-01-09 23:42:15 【问题描述】:

我有以下代码将 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-- 不工作

【问题讨论】:

感谢您制作代码 sn-p,但它什么也没做。另外,函数中的局部变量名似乎有问题。 好的,已编辑问题。 您的预期输出表明您将数字视为 32 位数字。但是,如果输入小于2**31,则不要在左侧用额外的零填充二进制转换的结果,以使其达到32 的长度。这就是为什么您的代码适用于2**31 或更大的输入,但不适用于小于2**31 的值。 (作为一种极端情况,考虑一下如果您的输入是 1 会发生什么。从您的预期输出推断,您希望在这种情况下的输出是 2147483648,但是您的代码将创建并反转一个字符串 @987654328 @,再次输出1。) 您能帮忙修改我的代码以适应这种情况吗? 你没有传递奇数,你所有的输入都是偶数。 【参考方案1】:

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

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

另外,对于上面的奇数,您的预期输出是什么?

在下面的 sn-p 中,我返回一个包含十进制、二进制、反向二进制和反向十进制值的对象。

更新 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 比较您的结果。

【讨论】:

当然,我已经用输入值和预期输出值更新了我的问题。谢谢。 这就是我需要产生的输出。因为转换实际上是使用 TAL 程序在后端进行的。我需要用 javascript 重写它。是否有一段代码可以更新上述代码以实现我需要的预期输出?非常感谢 另外,我还有另一个偶数 2635748224 的例子,这个工作正常。不确定代码在检查什么? 1562006400 --- 30038202 -- 不工作 3709490048 --- 30038203 -- 不能工作 @user2390526 好的,马克说得很对。请检查上面第二次更新中的建议。

以上是关于NodeJS中偶数错误输出的十进制到二进制转换的主要内容,如果未能解决你的问题,请参考以下文章

八进制到十进制和二进制输出错误

NodeJS读取缓冲区二进制文件以浮动

将二进制 NodeJS 缓冲区转换为 JavaScript ArrayBuffer

将十进制转换为二进制结果[关闭]

为啥我的二进制到十进制转换器程序中只有前 2 个输出正确?

尝试使用 c 中的递归将十进制转换为二进制转换器