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中偶数错误输出的十进制到二进制转换的主要内容,如果未能解决你的问题,请参考以下文章