javascript中的整数替代长度(不是32位)

时间:2013-03-25 11:51:13

标签: javascript data-structures integer bitwise-operators

问题如下:我需要处理完全编码为有符号整数的数字(MSB是符号,值是2的补码二进制值),但它们不是32位。即我有一个21位二进制值,我必须对其进行处理,以便第20位为符号,位19-0表示数字代码。我需要做一些像

这样的事情
int<21>a = 200000
int<21>b = 300000
int<21>c = a + b

目标语言是javascript,即所有标准二进制操作(如逐位添加/移位)都可用。有一个简单的algorythm吗?

2 个答案:

答案 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;

}