【问题标题】:C# So how does this hexadecimal stuff work?C# 那么这个十六进制的东西是如何工作的呢?
【发布时间】: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) 开始阅读数字系统。
  • 然后你就可以开始工作并阅读有关位移的信息(&gt; 是位移操作符)。但这没有意义,除非您了解十六进制和二进制...
  • hex A 是二进制的“1010”,5 是二进制的“0101”,仅此而已。如果你理解逻辑 - 你应该明白为什么你也需要“1010”和“0101”。

标签: c# binary hex size bit


【解决方案1】:

0x2AAAAAAA 是 32 位二进制的 00101010101010101010101010101010

0x15555555 是 32 位二进制的 00010101010101010101010101010101‬

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

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

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

【讨论】:

  • 我特意询问的是 0x2AAAAAAA 和 0x15555555 的语法。我理解这个逻辑就好了。
  • @TomBuck“语法”?十六进制数就是这样写的。
  • @TomBuck 它们是十六进制数字。 0x表示后面的数字是16进制数,所以可以用0-9,AF,af作为数字,有一个约定,数字是0,1,2,3,4,5,6 , 7, 8, 9, a, b, c, d, e, f(或大写变体),其中 0xa = 10 十进制,0xf = 15 十进制。由此,0x10 = 16 十进制。
  • 我想我假设它更复杂。那么这些只是 1431655765 和 2863311530 的十六进制表示呢? (0101010101... 和 1010101010... 二进制)
  • @TomBuck base10 值完全不相关。它们是 00101010101010101010101010101010 和 00010101010101010101010101010101 的十六进制表示。 首先写解决方案的人写了两个具有他想要的属性的二进制数,然后他转换成十六进制数(因为旧版本的C#不能直接使用二进制数,从 C# 7.0 更改)。请注意,您可以通过一次将数字 4 分组来从二进制转换为十六进制。 0000 = 0, 0001 = 1, ... 1110 = e, 1111 = f 不经过十进制。
【解决方案2】:

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

约束: 0 ≤ n

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

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

【讨论】:

  • 嗯,虽然我理解原始代码,但我不明白这有什么解释...恕我直言,您的回答不会支付任何费用...
  • 这个答案...为什么是?为什么是 5s?