3

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

int<21>a = 200000
int<21>b = 300000
int<21>c = a + b

目标语言是javascript,即所有标准二进制操作,如按位加/移都可用。有没有简单的算法?

4

2 回答 2

1

本机不可能有 21 位整数。但是由于您需要小于 2^20 的整数,它们无论如何都足够小以适合 0 到 19 位。
如果没有更多信息,我的建议是,将 2^20 = 1048576 添加到每个整数作为符号。然后在对它们进行运算时必须小心,因此请自行实现以 2^20 为符号的基本数学运算。

于 2013-03-25T12:49:00.587 回答
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;

}
于 2013-12-20T13:07:42.010 回答