我需要在OpenInsight 8上实现按位移位(逻辑非算术)。
在系统中,大多数都是字符串,但有4个函数将数字视为32位整数。
可用的按位函数是和否,xor。任何算术运算符都将该数字视为已签名。
我目前遇到了实现左右移位的问题,我需要实现SHA-1。
有人能建议一种可以帮助我实现这个目标的算法吗?伪代码足够好,我只需要一个大致的想法。
答案 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移入。