【问题标题】:Implementing logical shifts实施逻辑转变
【发布时间】:2012-08-21 12:34:53
【问题描述】:

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

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

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

谁能推荐一种算法来帮助我完成这个任务?伪代码已经足够好了,我只需要一个大致的想法。

【问题讨论】:

  • 你真的需要自己实现SHA1吗?没有可用的库?
  • 不...没有库。我环顾四周试图找到一个
  • 你可以尝试一些代码吗?
  • 为什么不在上面的代码sn-p中使用十六进制呢? 0x80000000 不是比 2,147,483,648 更容易理解吗?
  • 因为那是一个代码 sn-p... 而语言不支持十六进制常量

标签: bit-manipulation shift


【解决方案1】:

你可以用整数乘除法实现移位:

左移 = *2

右移 = /2

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

【讨论】:

  • 我已经试过了,但是有些东西不能正常工作。这就是为什么我要求提供伪代码,以便查看我是否做错了什么
  • 这行不通。将一个负数除以 2 轮向零,而将负数向右移动 1 轮向负无穷大(并且,对于逻辑移位,丢失符号位)。
【解决方案2】:

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

如果 v

【讨论】:

    【解决方案3】:

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

    例如:右移2位:

    x >= 2;
    x &= 0x3fffffff;
    

    右移 n 位

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多