Javascript 将带符号的十进制数转换为用两个';补语
我需要使用二的补码表示法将有符号的整数编码为十六进制。例如,我想转换Javascript 将带符号的十进制数转换为用两个';补语,javascript,twos-complement,Javascript,Twos Complement,我需要使用二的补码表示法将有符号的整数编码为十六进制。例如,我想转换 e.g. -24375 to 0xffffa0c9. 到目前为止,我一直在从事以下工作: parseInt(-24375).toString(2) > "-101111100110111" 这与Wolfram Alpha匹配,但我不确定如何获得数字的有符号24位int表示(ffffa0c9) 我已经解决了如何获取无符号二进制数并将其表示为2的补码: ~ parseInt("101111100110111",
e.g. -24375 to 0xffffa0c9.
到目前为止,我一直在从事以下工作:
parseInt(-24375).toString(2)
> "-101111100110111"
这与Wolfram Alpha匹配,但我不确定如何获得数字的有符号24位int表示(ffffa0c9)
我已经解决了如何获取无符号二进制数并将其表示为2的补码:
~ parseInt("101111100110111", 2) + 1
> -23475
但我不确定是否能将这个数字的二进制表示形式转换为十六进制
有什么想法吗 要创建两个固定大小的“赞美”数字,我创建了factory方法:
function createToInt(size) {
if (size < 2) {
throw new Error('Minimum size is 2');
}
else if (size > 64) {
throw new Error('Maximum size is 64');
}
// Determine value range
const maxValue = (1 << (size - 1)) - 1;
const minValue = -maxValue - 1;
return (value) => {
if (value > maxValue || value < minValue) {
throw new Error(`Int${size} overflow`);
}
if (value < 0) {
return (1 << size) + value;
}
else {
return value;
}
};
}
下面是一个使用
parseInt
的非常简单的解决方案:
function DecimalHexTwosComplement(decimal) {
var size = 8;
if (decimal >= 0) {
var hexadecimal = decimal.toString(16);
while ((hexadecimal.length % size) != 0) {
hexadecimal = "" + 0 + hexadecimal;
}
return hexadecimal;
} else {
var hexadecimal = Math.abs(decimal).toString(16);
while ((hexadecimal.length % size) != 0) {
hexadecimal = "" + 0 + hexadecimal;
}
var output = '';
for (i = 0; i < hexadecimal.length; i++) {
output += (0x0F - parseInt(hexadecimal[i], 16)).toString(16);
}
output = (0x01 + parseInt(output, 16)).toString(16);
return output;
}
}
函数decimalhextwo实现(十进制){
变量大小=8;
如果(十进制>=0){
var十六进制=十进制.toString(16);
而((十六进制长度%size)!=0){
十六进制=”“+0+十六进制;
}
返回十六进制;
}否则{
var十六进制=Math.abs(十进制).toString(16);
而((十六进制长度%size)!=0){
十六进制=”“+0+十六进制;
}
var输出=“”;
对于(i=0;i
对于长度最多为16的十六进制,应该可以正常工作
function DecimalHexTwosComplement(decimal) {
var size = 8;
if (decimal >= 0) {
var hexadecimal = decimal.toString(16);
while ((hexadecimal.length % size) != 0) {
hexadecimal = "" + 0 + hexadecimal;
}
return hexadecimal;
} else {
var hexadecimal = Math.abs(decimal).toString(16);
while ((hexadecimal.length % size) != 0) {
hexadecimal = "" + 0 + hexadecimal;
}
var output = '';
for (i = 0; i < hexadecimal.length; i++) {
output += (0x0F - parseInt(hexadecimal[i], 16)).toString(16);
}
output = (0x01 + parseInt(output, 16)).toString(16);
return output;
}
}