【问题标题】:integer number of alternative length (not 32-bit) in javascriptjavascript中替代长度的整数(不是32位)
【发布时间】:2013-03-25 11:51:13
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以只使用普通的 32 位整数 - 额外的位将只是符号扩展(全 0 表示正数,全 1 表示负数),因此您可以放心地忽略它们。
  • @PaulR,这主意不错!

标签: javascript data-structures integer bitwise-operators


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    已经过去了一段时间,但我将在这里留下一个生成的 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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多