javascript中替代长度的整数(非32位)
问题描述:
问题如下:我需要处理完全按照有符号整数编码的数字(MSB是符号,该值是2的补码二进制值),但他们不是32位。即我有一个21位二进制值,我必须处理,以便第20位是符号,位19-0代表数字代码。我需要做的是这样javascript中替代长度的整数(非32位)
int<21>a = 200000
int<21>b = 300000
int<21>c = a + b
目标语言是JavaScript,就像逐位加即所有标准的二进制运算/班可供选择。有一个简单的algorythm?
答
经过一些时间,但我就离开这里产生的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;
}
答
本地它不可能有21位整数。但是当你需要Integeres小于2^20时,它们无论如何都足够小以适应0到19位。
没有更多的信息,我的建议是,为每个整数加上2^20 = 1048576作为符号。然后,在与他们进行操作时必须小心谨慎,所以要以2^20作为标志,自行实施基本的数学运算。
有趣。为什么? – Joe 2013-03-25 12:05:42
您可以使用正常的32位整数 - 附加位只是符号扩展(全部为0表示正数,全为1表示负数),因此您可以放心地忽略它们。 – 2013-03-25 13:21:32
@PaulR,这是个好主意! – Clergyman 2013-03-25 18:24:11