问题如下:我需要处理完全编码为有符号整数的数字(MSB是符号,值是2的补码二进制值),但它们不是32位。即我有一个21位二进制值,我必须对其进行处理,以便第20位为符号,位19-0表示数字代码。我需要做一些像
这样的事情int<21>a = 200000
int<21>b = 300000
int<21>c = a + b
目标语言是javascript,即所有标准二进制操作(如逐位添加/移位)都可用。有一个简单的algorythm吗?
答案 0 :(得分:1)
本地不可能有21位整数。但是因为你需要小于2 ^ 20的Integeres,它们总是足够小以适应0到19位 没有更多信息,我的建议是,将2 ^ 20 = 1048576添加到每个整数作为符号。然后你在使用它们进行操作时必须要小心,所以关于2 ^ 20作为符号,你自己实现基本的数学运算。
答案 1 :(得分:0)
过了一段时间了,但我会留下一个生成的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;
}