Bitmasking - 何时使用十六进制与二进制

时间:2017-01-16 00:48:58

标签: algorithm binary hex bit-manipulation bitmask

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

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

我得到她的解决方案,但我不明白她是如何抓住偶数/奇数位的。她创建了两个位掩码 - 两个十六进制 - 用于32位整数。两者是:0xaaaaaaaa和0x55555555。据我所知,她基本上创建了等效的1010101010 ...用于十六进制的32位整数,然后用原始num进行AND运算以分别获取偶数/奇数位。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  • 十六进制版本利用了分块。假设您认识到0x0a == 0b1010,您可以在心理上描绘假定值中的8组1010。
  • 另一种可能性是八进制25252525252,因为......好吧,也许不是。您可以看到某些东西是交替的,但除非你使用octal 很多,否则不清楚二进制中的交替模式是什么。