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 比较您的结果。
我有以下代码将 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 比较您的结果。