问题如下:我需要处理完全编码为有符号整数的数字(MSB 是符号,值是 2 的补码二进制值),但它们不是 32 位的。即我有一个 21 位二进制值,我必须对其进行处理,以便第 20 位是符号,而第 19-0 位表示数字代码。我需要做类似的事情
int<21>a = 200000
int<21>b = 300000
int<21>c = a + b
目标语言是javascript,即所有标准二进制操作,如按位加/移都可用。有没有简单的算法?
问题如下:我需要处理完全编码为有符号整数的数字(MSB 是符号,值是 2 的补码二进制值),但它们不是 32 位的。即我有一个 21 位二进制值,我必须对其进行处理,以便第 20 位是符号,而第 19-0 位表示数字代码。我需要做类似的事情
int<21>a = 200000
int<21>b = 300000
int<21>c = a + b
目标语言是javascript,即所有标准二进制操作,如按位加/移都可用。有没有简单的算法?
本机不可能有 21 位整数。但是由于您需要小于 2^20 的整数,它们无论如何都足够小以适合 0 到 19 位。
如果没有更多信息,我的建议是,将 2^20 = 1048576 添加到每个整数作为符号。然后在对它们进行运算时必须小心,因此请自行实现以 2^20 为符号的基本数学运算。
一段时间过去了,但我将在这里留下一个生成的 javascript 代码,以防其他人需要它,此函数将 32 位 int 值转换为 N 位 int:
function 32BitsToN (intValue) {
var retVal=0;
var leftMask = 0;
var flag = (1 << N-1);
if ((value & flag )!= 0) { //Nth bit is set, the value is negative.
//WScript.Echo('NEGATIVE!\n');
//WScript.Echo('Incoming: '+value)
//we need to set all bits N-32 to 1
for (var i = 1; i<= (32-N); i++) {
leftMask |= 1<<32-i;
}
retval = value | leftMask;
//incoming: |1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|x|x|x|x|x|
//Mask: |1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|0|0|0|0|0|0|
//result: |0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|x|x|x|x|x|
} else {
retval = value;
}
return retval;
}