代码之家  ›  专栏  ›  技术社区  ›  Tom Buck

那么这个十六进制的东西是怎么工作的呢?

  •  0
  • Tom Buck  · 技术社区  · 6 年前

    我正在codebaights.com做一些入门级的编程挑战,我遇到了以下问题。这个链接指向一个有答案的博客,但也包含了问题。如果它有一个解释…

    https://codefightssolver.wordpress.com/2016/10/19/swap-adjacent-bits/

    我关心的是代码行(它是 只有 下面的代码行)。

    return (((n & 0x2AAAAAAA) >> 1) | ((n & 0x15555555) << 1)) ;
    

    具体来说,我正在努力寻找一些关于“0x2aaaaaa”和“0x1555555”如何工作的体面信息,所以我有几个愚蠢的问题。我知道它们代表10101010的二进制值…和01010101…分别是。

    1。我已经搞乱了一些,发现5s和as的数量是松散的,就我所知是比特大小而言,但如何做到呢?

    2。为什么是?为什么是5S?

    三。为什么2和1在as和5s之前?

    4。关于这件事我还有什么要知道的吗?有没有人知道一个很酷的博客或网站,更详细地解释了其中的一些?

    2 回复  |  直到 6 年前
        1
  •  -1
  •   tomcat    6 年前

    0x2aaaaaa用于获取30位,这是约束条件。

    限制条件: 0¥N<2^30。

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

    您也可以使用0b101010101010101010101010101010,如果您喜欢,这取决于语言。

        2
  •  2
  •   xanatos    6 年前

    0x2AAAAAAA 00101010101010101010101010101010 在32位二进制中,

    0x15555555 是… 00010101010101010101010101010101‬ 32位二进制。

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

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

    现在。。。我们可以这么说,考虑到约束条件, x & 0x2AAAAAAA 将返回偶数位 x (如果我们把比特数作为第一,第二,第三……第二位是偶数),而 x & 0x15555555 将返回的奇数位 . 通过使用 << 1 >> 1 你把它们移动一步。通过使用 | (或)重新合并它们。