我在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。还有什么我应该知道的吗?有没有人知道一篇很酷的博客文章或网站更详细地解释其中的一些内容?
答案 0 :(得分:2)
0x2AAAAAAA
是32位二进制的00101010101010101010101010101010
,
0x15555555
是32位二进制的00010101010101010101010101010101
。
请注意,问题指定Constraints: 0 ≤ n < 2^30
。因此,最高的两位可以是00
。
这两个十六进制数字已被&#34;内置&#34;从他们的二进制表示开始,具有特定属性(我们将在下一段中看到)。
现在......我们可以说,给定约束,x & 0x2AAAAAAA
将返回x
的偶数位(如果我们将这些位计为第一位,第二位,第三位......第二位是偶数),而x & 0x15555555
将返回x
的奇数位。通过使用<< 1
和>> 1
,您可以将它们移动一步。使用|
(或)重新合并它们。
答案 1 :(得分:-1)
0x2AAAAAAA用于获取30位,这是约束。
约束: 0≤n<0 2 ^ 30
0x15555555也表示30位,其他位与其他位相反。 我将从计算器中的二进制数字(101010101010101010101010101010)开始,使用程序员计算器选择十六进制,以十六进制显示数字。
如果您愿意,也可以使用0b101010101010101010101010101010,具体取决于语言。