实施轮班

时间:2012-08-21 12:34:54

标签: bit-manipulation shift

我需要在OpenInsight 8上实现按位移位(逻辑非算术)。

在系统中,大多数都是字符串,但有4个函数将数字视为32位整数。

可用的按位函数是和否,xor。任何算术运算符都将该数字视为已签名。

我目前遇到了实现左右移位的问题,我需要实现SHA-1。

有人能建议一种可以帮助我实现这个目标的算法吗?伪代码足够好,我只需要一个大致的想法。

3 个答案:

答案 0 :(得分:1)

您可以使用整数乘法和除法实现移位:

左移= * 2

右移= / 2

也许您需要首先屏蔽该数字以使最重要的位为零以防止整数溢出。

答案 1 :(得分:0)

使用带符号算术和按位运算将逻辑向下移位一位

if v < 0 then
   v = v & 0x7fffffff   // clear the top bit
   v = v / 2            // shift the rest down
   v = v + 0x40000000   // set the penultimate bit
else
   v = v / 2
fi

答案 2 :(得分:0)

如果没有逻辑右移,你可以通过向右移位n位来轻松实现这一点,然后清除前n位

例如:右移2位:

x >= 2;
x &= 0x3fffffff;

右移n位

x >= n;
x &= ~(0xffffffff << (32 - n));
// or
x >= n;
x &= (1 << (32 - n)) - 1;

对于左移,没有逻辑/数学区别,因为它们都是相同的,只是将0移入。