【发布时间】:2025-12-21 17:05:15
【问题描述】:
我在 codefights.com 上做一些入门级编程挑战,我遇到了以下问题。该链接指向具有答案的博客,但其中也包含问题。要是有解释就好了……
https://codefightssolver.wordpress.com/2016/10/19/swap-adjacent-bits/
我关心的是下面的代码行(它是唯一行代码)。
return (((n & 0x2AAAAAAA) >> 1) | ((n & 0x15555555) << 1)) ;
具体来说,我正在努力寻找一些关于“0x2AAAAAAA”和“0x15555555”如何工作的体面信息,所以我有一些愚蠢的问题。我知道它们分别代表 10101010... 和 01010101... 的二进制值。
1.我搞砸了一些,发现 5s 和 As 的数量松散地对应,据我所知,但是如何?
2.为什么是?为什么是 5s?
3.为什么在 As 和 5s 之前是 2 和 1?
4.还有什么我应该知道的吗?有谁知道一个很酷的博客文章或网站可以更详细地解释其中的一些内容?
【问题讨论】:
-
你知道十六进制到底是什么吗?
-
所以你基本上想知道十六进制系统是如何工作的?这只是数字,头部的“0x”告诉我们,它们不是像我们通常的十进制系统那样使用以 10 为底的,而是以 16 为底的。我建议从好的旧* (en.m.wikipedia.org/wiki/Numeral_system) 开始阅读数字系统。
-
然后你就可以开始工作并阅读有关位移的信息(
>是位移操作符)。但这没有意义,除非您了解十六进制和二进制... -
hex A 是二进制的“1010”,5 是二进制的“0101”,仅此而已。如果你理解逻辑 - 你应该明白为什么你也需要“1010”和“0101”。