我要提出免责声明,说这是我的作业问题。所以我不一定要您解决它,我只想澄清一下。

确切的问题是这样的:



它还暗示不需要任何条件语句。

我仔细研究了一下,发现是否可以通过移位将偶数和奇数位分开来完成此任务。我不明白的是如何操纵单个位。在python(我习惯的编程语言)中,使用索引运算符很容易,因为您可以只执行number [0],并且可以获得第一位。你如何做这样的组装?

编辑:
因此,@ jotik,感谢您的帮助。我实现了这样的事情:

mov edi, ebx
and edi, 0x5555555555555555
shl edi, 1
mov esi, ebx
and esi, 0xAAAAAAAAAAAAAAAA
shr esi, 1
or edi, esi
mov eax, edi

当我看到|运算符,我在想还是||。愚蠢的错误。

最佳答案

在汇编中,可以将bit masks与其他bitwise operations一起使用来存档结果。

result = ((odd-bit-mask & input) << 1) | ((even-bit-mask & input) >> 1)

其中odd-bit-mask是设置了所有奇数位(1)而未设置偶数位(0)的值;而even-bit-mask是设置了所有偶数位(1)而未设置奇数位的值。对于64位值,奇数和偶数掩码分别为(十六进制)0x0x55555555555555550xAAAAAAAAAAAAAAAA

因此,汇编算法的伪代码可能类似于以下内容:
oddbits  = input & 0x5555555555555555
oddbits  = oddbits << 1
evenbits = input & 0xAAAAAAAAAAAAAAAA
evenbits = evenbits >> 1
result   = oddbits | evenbits

其中&是按位与运算,|是按位或运算,<<>>分别是按位左移和按位右移。

PS:您可以在Sean Eron Anderson的Bit Twiddling Hacks网页上找到其他有用的位操作技巧。

关于assembly - 在程序集x86中交换位(或仅访问它们),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36711810/

10-13 08:15