我需要在 OpenInsight 8 上实现按位移位(逻辑,而不是算术)。
在系统中,几乎所有内容都是字符串,但有 4 个函数将数字视为 32 位整数。可用的按位函数有 AND、OR、NOT 和 XOR。任何算术运算符都将数字视为带符号的。
我目前在实现左右移位时遇到问题,我需要实现 SHA-1。
任何人都可以建议一种可以帮助我实现这一目标的算法吗?伪代码已经足够好了,我只需要一个大致的想法。
我需要在 OpenInsight 8 上实现按位移位(逻辑,而不是算术)。
在系统中,几乎所有内容都是字符串,但有 4 个函数将数字视为 32 位整数。可用的按位函数有 AND、OR、NOT 和 XOR。任何算术运算符都将数字视为带符号的。
我目前在实现左右移位时遇到问题,我需要实现 SHA-1。
任何人都可以建议一种可以帮助我实现这一目标的算法吗?伪代码已经足够好了,我只需要一个大致的想法。
您可以使用整数乘法和除法实现移位:
左移 = *2
右移 = /2
也许您需要首先屏蔽数字以使最重要的位为零以防止整数溢出。
如果没有逻辑右移,您可以通过算术右移 n 位轻松实现,然后清除前 n 位
例如:右移 2 位:
x >= 2;
x &= 0x3fffffff;
右移 n 位
x >= n;
x &= ~(0xffffffff << (32 - n));
// or
x >= n;
x &= (1 << (32 - n)) - 1;
对于左移,没有逻辑/数学差异,因为它们都是相同的,只需将 0 移入。
使用有符号算术和按位运算逻辑下移一位
如果 v < 0 那么 v = v & 0x7fffffff //清除最高位 v = v / 2 // 将其余部分向下移动 v = v + 0x40000000 //设置倒数第二位 别的 v = v / 2 菲