我无法找到在程序集x86中旋转一个字节的单个半字节的方法。例如,我想将hi半字节旋转为左1,并且低半字节右旋1,使0xB4变为0x72。
答案 0 :(得分:1)
这有时被称为“位组移动”,您可以在汇编中实现:
0.10
它基本上是一种蛮力的方式来实现排列,同时移动具有相同移位计数/方向的每个“组”位。它往往有点冗长。
8位排列的一个有趣的策略是“通过乘法置换”,遗憾的是它涉及一些巨大的常数:
x = ((x & 0x70) << 1)
| ((x & 0x01) << 3)
| ((x & 0x80) >> 3)
| ((x & 0x0e) >> 1);
除非通过内存操作数加载大量常量,否则代码大小要大得多。
但所有这一切确实在做的是避免使用256字节的查找表,这样更简单,在许多情况下更快(除非表格很冷)并且只是略大一些。
答案 1 :(得分:0)
没有汇编指令可以帮助解决这个问题。你只需要明确地将这些位放在你想要的位置。
x = (x >> 3 & 0x10) | (x << 1 & 0xe0) | (x << 3 & 0x08) | (x >> 1 & 0x07);