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?

+1

有趣。为什么? – Joe 2013-03-25 12:05:42

+1

您可以使用正常的32位整数 - 附加位只是符号扩展(全部为0表示正数,全为1表示负数),因此您可以放心地忽略它们。 – 2013-03-25 13:21:32

+0

@PaulR,这是个好主意! – Clergyman 2013-03-25 18:24:11

经过一些时间,但我就离开这里产生的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作为标志,自行实施基本的数学运算。