Facebook 面試題 | 將數字轉換為十六進位制

九章演算法發表於2017-08-19

專欄 | 九章演算法
網址 | www.jiuzhang.com

題目描述

給出一個整型(int)的數
將其轉換為十六進位制的表示方法
負數要用二進位制補碼的形式表示

樣例輸入

Example 1
Input:
26

Output:
"1a"

Example 2
Input:
-1

Output:
"ffffffff"

解題分析

❖首先,如果這個數是個正數的話,那麼非常簡單:
只需要考慮十進位制數到16進位制數的轉換,那麼轉換十六進位制只需要用這個數對16^0,16^1,16^2……取餘得到轉換成16進位制後的每一位(還有一點需要注意的是16進位制下10~15我們用a~f表示)。

❖所以這題的關鍵就在於負數的情況。

負數的二進位制補碼錶示

很多人都是知道:

負數在計算機內部的儲存方式是補碼的形式
負數的補碼就等於其正數反碼+1

舉個例子,如果我們使用的是4位的二進位制,那麼2的表示形式就是0010,2的反碼錶示形式就是1101,所以-2的表示形式就是其反碼+1,是1110,轉換成16進位制也是同樣的道理。
所以我們這種思路的做法就是16進製表示形式,然後再對其進行取反,最後再+1得到我們的答案。

計算機內部儲存形式轉換

一個整型的數,在計算機內部是怎麼儲存的呢?

很明顯是已二進位制的形式儲存的,那麼不管我們輸入的是正數還是負數,其實計算機內部已經有了完整的儲存,那麼其實不需要我們自己再去計算反碼補碼,我們只需要對其進行2進位制轉換成16進位制就可以了。

因為二進位制一位表示的是2,16進位制一位表示的是16,那麼也就是說16進位制下一位表示的是2進位制下的4位(16 = 2^4)。在轉換的過程中我們就可以每四位轉換成一位,這裡有個小技巧:

用到位運算&和>>來提高執行速度,&15相當於%16

(這裡同學們可以自己思考一下為什麼這樣是一定的。)

面試官角度分析

❖需要理解負數在計算機中的儲存形式,以及掌握補碼的轉換方法。
❖瞭解計算機儲存數的機制
❖不僅能轉換正數,還要能夠熟練轉換負數16進位制,此題才能夠拿到hire

相關Lintcode面試題
www.lintcode.com/zh-cn/probl…
www.lintcode.com/zh-cn/probl…
www.lintcode.com/zh-cn/probl…


推薦閱讀:



歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等

九章演算法,IT教育領域的深耕者
九章演算法,IT教育領域的深耕者

相關文章