我要提出免责声明,说这是我的作业问题。所以我不一定要您解决它,我只想澄清一下。
确切的问题是这样的:
它还暗示不需要任何条件语句。
我仔细研究了一下,发现是否可以通过移位将偶数和奇数位分开来完成此任务。我不明白的是如何操纵单个位。在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位值,奇数和偶数掩码分别为(十六进制)0x0x5555555555555555
和0xAAAAAAAAAAAAAAAA
。因此,汇编算法的伪代码可能类似于以下内容:
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/