使用16位在32位值上实现位移

时间:2010-12-20 03:36:04

标签: math bit-manipulation bitwise-operators

我正在使用一种只能对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)
 }

但这当然不像我提到的那样有用。任何人都可以提供一些意见吗?

1 个答案:

答案 0 :(得分:1)

对于左移1,移位高位字,将低位字移位为0x8000,如果AND的结果不为0则将上位结果移位1,然后移位低位字。

对于右移1,如果AND的结果不为0,则移位低位字,并将高位字移位1,将低位移位与0x8000移位,然后移位高位字。

在ORing之前移位多于一位需要较大的AND值和适当的移位值。