如何将二进制数转换为带符号的十进制数
How to convert a binary number into a Signed decimal number
我有一个类似这样的二进制数.. var data = "1100110010"。
我正在尝试将其转换为 Javascript 中适当的带符号十进制数。
我使用的步骤如下
1) var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
bin2dec 给出转换后的十进制数为 "818" 。
但我也想访问二进制数的带符号十进制。
此二进制代码的带符号十进制数是“-206”。
如何从给定的二进制数访问有符号和无符号的十进制值。请告诉我 。任何想法都会有所帮助
使用一些移位技巧
function uintToInt(uint, nbit) {
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('uintToInt only supports ints up to 32 bits');
uint <<= 32 - nbit;
uint >>= 32 - nbit;
return uint;
}
uintToInt(818, 10); // -206
为什么818
?因为这是 uint 值 binary string
parseInt('1100110010', 2); // 818
为什么是10
?因为您的 signed int 由 二进制字符串
中的 10
位表示
'1100110010'.length; // 10
请注意,对于正数,您不能只取 nbit = str.length;
,因为字符串可能未被 0
填充,您需要知道实际有多少位使用
您可能还想为 uint > 4294967295
抛出错误
为了完整性,
function intToUint(int, nbit) {
var u = new Uint32Array(1);
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('intToUint only supports ints up to 32 bits');
u[0] = int;
if (nbit < 32) { // don't accidentally sign again
int = Math.pow(2, nbit) - 1;
return u[0] & int;
} else {
return u[0];
}
}
intToUint(-206, 10); // 818
这是你想要的吗?
var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
var signed = (data.substr(0,1) === '1' ? '-':'+') + parseInt(data.substr(1),2);
这将为您提供 -306 作为签名号码。我不确定您在问题中指定的数字是否有错字 (-206)。
可能不是最佳解决方案,但应该可行。在决定它是否已签名之前,您可能仍想检查二进制位数。
可以使用 JavaScript 的 typed arrays 将二进制数转换为带符号的十进制数。
const unsigned = 0b1111111100110010;
const [ signed ] = new Int16Array([0b1111111100110010]);
console.log(unsigned); // => 65330
console.log(signed); // => -206
我敢肯定这会比按位运算的性能低,但它肯定会减少代码。
其他一些方式:
const bin = "1100110010"
const decimal = parseInt(bin,2)
const numBits = bin.length
let p = 0x80000000 >> (32 - numBits)
console.log(p | decimal)
//or:
console.log(parseInt(bin.padStart(32,'1'),2) | 0)
这将采用 <= 32 位的未知位模式,如果它是 < 8 位,则转换为正整数,如果 >= 8 且前导 1,则转换为负符号整数。
诀窍是在parseInt
之前填充到32
const getSigned = binStr => parseInt(binStr.length >= 8 && binStr[0] === "1" ?
binStr.padStart(32, "1") : binStr.padStart(32, "0"), 2) >> 0;
const signed = [
"1100110010", // -206
"11111011", // -5
"01111011", // 123
"1111111111000" // -8
].map(getSigned);
console.log(signed);
我有一个类似这样的二进制数.. var data = "1100110010"。 我正在尝试将其转换为 Javascript 中适当的带符号十进制数。
我使用的步骤如下
1) var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
bin2dec 给出转换后的十进制数为 "818" 。
但我也想访问二进制数的带符号十进制。
此二进制代码的带符号十进制数是“-206”。
如何从给定的二进制数访问有符号和无符号的十进制值。请告诉我 。任何想法都会有所帮助
使用一些移位技巧
function uintToInt(uint, nbit) {
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('uintToInt only supports ints up to 32 bits');
uint <<= 32 - nbit;
uint >>= 32 - nbit;
return uint;
}
uintToInt(818, 10); // -206
为什么
818
?因为这是 uint 值 binary stringparseInt('1100110010', 2); // 818
为什么是
中的10
?因为您的 signed int 由 二进制字符串10
位表示'1100110010'.length; // 10
请注意,对于正数,您不能只取 nbit = str.length;
,因为字符串可能未被 0
填充,您需要知道实际有多少位使用
您可能还想为 uint > 4294967295
为了完整性,
function intToUint(int, nbit) {
var u = new Uint32Array(1);
nbit = +nbit || 32;
if (nbit > 32) throw new RangeError('intToUint only supports ints up to 32 bits');
u[0] = int;
if (nbit < 32) { // don't accidentally sign again
int = Math.pow(2, nbit) - 1;
return u[0] & int;
} else {
return u[0];
}
}
intToUint(-206, 10); // 818
这是你想要的吗?
var data = "1100110010";
var bin2dec = parseInt(data,2).toString(10);
var signed = (data.substr(0,1) === '1' ? '-':'+') + parseInt(data.substr(1),2);
这将为您提供 -306 作为签名号码。我不确定您在问题中指定的数字是否有错字 (-206)。
可能不是最佳解决方案,但应该可行。在决定它是否已签名之前,您可能仍想检查二进制位数。
可以使用 JavaScript 的 typed arrays 将二进制数转换为带符号的十进制数。
const unsigned = 0b1111111100110010;
const [ signed ] = new Int16Array([0b1111111100110010]);
console.log(unsigned); // => 65330
console.log(signed); // => -206
我敢肯定这会比按位运算的性能低,但它肯定会减少代码。
其他一些方式:
const bin = "1100110010"
const decimal = parseInt(bin,2)
const numBits = bin.length
let p = 0x80000000 >> (32 - numBits)
console.log(p | decimal)
//or:
console.log(parseInt(bin.padStart(32,'1'),2) | 0)
这将采用 <= 32 位的未知位模式,如果它是 < 8 位,则转换为正整数,如果 >= 8 且前导 1,则转换为负符号整数。
诀窍是在parseInt
之前填充到32const getSigned = binStr => parseInt(binStr.length >= 8 && binStr[0] === "1" ?
binStr.padStart(32, "1") : binStr.padStart(32, "0"), 2) >> 0;
const signed = [
"1100110010", // -206
"11111011", // -5
"01111011", // 123
"1111111111000" // -8
].map(getSigned);
console.log(signed);