0

我需要在 OpenInsight 8 上实现按位移位(逻辑,而不是算术)。

在系统中,几乎所有内容都是字符串,但有 4 个函数将数字视为 32 位整数。可用的按位函数有 AND、OR、NOT 和 XOR。任何算术运算符都将数字视为带符号的。

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

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

4

3 回答 3

1

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

左移 = *2

右移 = /2

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

于 2012-08-21T12:42:23.733 回答
0

如果没有逻辑右移,您可以通过算术右移 n 位轻松实现,然后清除前 n 位

例如:右移 2 位:

x >= 2;
x &= 0x3fffffff;

右移 n 位

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

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

于 2013-07-28T12:32:43.053 回答
0

使用有符号算术和按位运算逻辑下移一位

如果 v < 0 那么
   v = v & 0x7fffffff //清除最高位
   v = v / 2 // 将其余部分向下移动
   v = v + 0x40000000 //设置倒数第二位
别的
   v = v / 2
菲

于 2013-07-12T08:18:43.120 回答