【问题标题】:Reverse order of bits using shift and rotate使用移位和循环反转位顺序
【发布时间】:2012-10-27 04:39:01
【问题描述】:

我被要求在硬件上反转位,例如镜像翻转它们,例如 1011 0100 变为 0010 1101,使用移位和旋转组合。我了解这些命令是如何工作的,但我想不出一种方法来翻转它们。谢谢。 我需要使用 SAL 汇编语言来完成。

【问题讨论】:

  • 我也不能。你也可以使用 AND 和 OR 吗?
  • @MattBall 1234 5678 => 2345 6781 是向左旋转一倍。
  • @JanDvorak 不确定这与“shift”有何不同。
  • 删除了作业标签,因为它一直是deprecated
  • 尝试查看this question,作为开始

标签: rotation shift


【解决方案1】:

如果您只需要使用移位来翻转 b 位字,您可以模拟堆栈:

b times{
  right shift on the input register, setting a carry flag.
  left shift on the output register, reading the carry flag.
}

请注意,x86 具有“通过进位循环”指令 - 它们有两种用途(或使用不带进位的输入寄存器进行循环以保留输入)。如果进位左移不可用但进位右移可用,则将前面算法中的单词“left”和“right”颠倒过来。如果没有可用的进位移位,则需要通过“普通”逻辑移位进行模拟,然后设置正确的位,但是...

如果你也可以使用 AND 和 OR 并且 b 是预先知道的并且是 2 的幂,那么有一种更快的方法。反转每对中的两个位,然后在每个半字节内反转两个对,然后在每个字节内反转两个半字节,然后在每个字内反转两个字节......

对于 8 位 x:

                                    //1234 5678
x = (0x55 & x)<< 1 | (0xAA & x)>> 1 //2143 6587
x = (0x33 & x)<< 2 | (0xCC & x)>> 2 //4321 8765
x = (0x0F & x)<< 4 | (0xF0 & x)>> 4 //8765 4321

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2012-11-15
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多