C# 那么这个十六进制的东西是如何工作的呢?

C# So how does this hexadecimal stuff work?

我在 codefights.com 做一些入门级的编程挑战,我遇到了以下问题。 link 指向有答案的博客,但其中也包含问题。要是有个解释就好了...

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。为什么2和1在As和5之前?

4.还有什么我应该知道的吗?有谁知道一个很酷的博客 post 或网站可以更详细地解释其中的一些内容?

0x2AAAAAAA 在 32 位二进制中是 00101010101010101010101010101010

0x15555555 是 32 位二进制的 00010101010101010101010101010101‬

请注意,问题指定 Constraints: 0 ≤ n < 2^30。因此最高两位可以是00

这两个十六进制数 "built" 从它们的二进制表示开始,具有特定的 属性(我们将在下一段中看到)。

现在...我们可以说,给定约束,x & 0x2AAAAAAA 将 return x 的偶数位(如果我们将这些位计算为第一、第二、第三...第二位是偶数),而 x & 0x15555555 将 return x 的奇数位。通过使用 << 1>> 1,您将它们移动了一步。通过使用 |(或)您重新合并它们。

0x2AAAAAAA用于获取30位,这是约束。

约束条件: 0 ≤ n < 2^30.

0x15555555 也代表 30 位与其他数字相反的位。 我将从计算器中的二进制数 (101010101010101010101010101010) 开始,然后 select 十六进制使用程序员计算器以十六进制显示数字。

如果您愿意,您也可以使用 0b101010101010101010101010101010,具体取决于语言。