我正在使用一种只能对16位数进行二进制数学运算的语言,但我需要在32位数值上使用二进制数学运算,所以我必须自己制作一些函数。例如,我将二进制OR实现为:
_32bit_or(a,b){
var{
a1=round(a/(2**16));
a2=a%(2**16);
b1=round(b/(2**16));
b2=b%(2**16);
}
.=((a1|b1) * (2**16)) + (a2|b2);
}
将32位值分成两个16位部分,或每个部分,然后重新组合。很简单。
但我现在需要实现变速并不那么容易,因为通过将数字分开,移位,然后重新组合,我正在失去位!我试过的是:
_32bit_rshift(a,b){
var{
a1=round(a/(2**16));
a2=a%(2**16);
}
. = ((a1>>b) * (2**16)) + (a2>>b)
}
但这当然不像我提到的那样有用。任何人都可以提供一些意见吗?
答案 0 :(得分:1)
对于左移1,移位高位字,将低位字移位为0x8000,如果AND的结果不为0则将上位结果移位1,然后移位低位字。
对于右移1,如果AND的结果不为0,则移位低位字,并将高位字移位1,将低位移位与0x8000移位,然后移位高位字。
在ORing之前移位多于一位需要较大的AND值和适当的移位值。