使用shift和rotate反转位的顺序

时间:2012-10-27 04:39:02

标签: rotation shift

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

1 个答案:

答案 0 :(得分: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"和"对"在以前的算法中。如果没有可用的转移,您需要通过"普通"模拟。逻辑移位后设置正确的位,但是......

如果你也可以使用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