位掩码——何时使用十六进制与二进制

Bitmasking--when to use hex vs binary

我正在解决 Cracking The Coding Interview 中的一个问题,该问题要求我使用尽可能少的指令交换整数中的奇数位和偶数位(例如,交换位 0 和 1,交换位 2 和 3交换等)

作者的解决方案围绕着使用掩码在一个数字中抓取奇数位,在另一个数字中抓取偶数位,然后将它们移动 1。

我得到了她的解决方案,但我不明白她是如何抓住 even/odd 位的。她为 32 位整数创建了两个位掩码——均为十六进制。这两个是:0xaaaaaaaa 和 0x55555555。我知道她实际上是在创建等同于 1010101010... 的 32 位十六进制整数,然后将其与原始数字进行 AND 运算以分别获取 even/odd 位。

我不明白的是她为什么要用十六进制?为什么不直接编码 10101010101010101010101010101010?她是否使用十六进制来减少冗长?什么时候应该使用一个而不是另一个?

这是为了减少冗长。二进制10101010101010101010101010101010、十六进制0xaaaaaaaa、十进制2863311530都表示完全相同的值;他们只是使用不同的基础来这样做。使用一个或另一个的唯一原因是为了可读性。

  • 大多数人显然不想在这里使用小数;它看起来像一个任意值。

  • 二进制很清楚:1和0交替出现,但是有这么多,看不出这是一个32位值,或者没有相邻的一对1或0躲在中间某处。

  • 十六进制版本利用了分块。假设你认识到0x0a == 0b1010,你可以在脑海中想象出假设值中的8组1010。
  • 另一种可能是八进制 25252525252,因为...好吧,也许不是。你可以看到 something 是交替的,但是除非你使用八进制 a lot,否则不清楚二进制中的交替模式是什么。