JavaScript中可替代长度(非32位)的整数

3
问题如下:我需要处理的数字是被编码为有符号整数的(最高位是符号位,其余位是二进制补码值),但它们不是32位。比如说,我有一个21位的二进制值,我需要处理这个值,使得第20位是符号位,位于第19-0位的是数字代码。我需要进行一些类似以下的操作:
int<21>a = 200000
int<21>b = 300000
int<21>c = a + b

目标语言是JavaScript,即所有标准的二进制运算如位加/移位都可用。是否有简单的算法?

1
您可以使用普通的32位整数 - 额外的位将仅是符号扩展(对于正数全部为0,对于负数全部为1),因此您可以安全地忽略它们。 - Paul R
2个回答

1
原生情况下,无法使用21位整数。但是,如果您需要小于2 ^ 20的整数,则它们足够小,可以适应位0到19。
如果没有更多信息,我的建议是将2 ^ 20 = 1048576添加到每个整数作为符号。然后,在执行操作时必须小心处理它们,因此请自己实现基本的数学运算,并考虑将2 ^ 20作为符号。

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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接