2017-01-16 27 views
0

我正在解決一個問題,因爲破解編碼採訪需要我用一個儘可能少的指令來交換整數中的奇數和偶數位(例如位0和1是交換,位2和3交換等)Bitmasking - 何時使用十六進制與二進制

作者的解決方案圍繞使用掩碼來抓取一個數字中的奇數位,並在另一個數字中抓取偶數位,然後將它們移出1

我得到她的解決方案,但我不明白她是如何抓住偶數/奇數位的。她創建了兩個位掩碼 - 雙十六進制 - 爲一個32位整數。這兩個是:0xaaaaaaaa和0x55555555。我知道她本質上是創造了相當於1010101010 ...對於一個十六進制的32位整數,然後將它與原始數字進行與運算,以分別獲取偶數/奇數位。

我不明白爲什麼她使用十六進制?爲什麼不只是代碼10101010101010101010101010101010?她是否使用十六進制來減少冗長?你應該什麼時候使用一個呢?

回答

1

這是爲了減少冗長。二進制10101010101010101010101010101010,十六進制0xaaaaaaaa和十進制2863311530全部表示,正好是相同的值;他們只是用不同的基地來這樣做。使用這個或另一個的唯一原因是爲了感知可讀性。

  • 大多數人顯然不想在這裏使用小數;它看起來像一個任意值。

  • 二進制是清楚的:交替1s和0s,但有這麼多,這不是很明顯,這是一個32位值,或沒有相鄰的一對1或0隱藏在中間某處。

  • 十六進制版本利用分塊。假設你認識到0x0a == 0b1010,你可以用假想的值在思維上描繪出8組1010。
  • 另一種可能性是八進制25252525252,因爲......好吧,也許不是。你可以看到,東西是交替的,但除非你使用八進制很多,它不清楚二進制中的交替模式是什麼。
+0

所以你可以在任何基地使用面具沒有問題? – Sunny

+1

是的;無論使用什麼基數,它都是相同的*值*。他們寫作「二十億八千六百三十一萬一千五百三十」的方式都不一樣。二進制和十六進制只是使它更明顯*爲什麼*這個特定的值正在被使用。 – chepner