專欄 | 九章算法
網址 | www.jiuzhang.com程序員
題目描述面試
給出一個整型(int)的數
將其轉換爲十六進制的表示方法
負數要用二進制補碼的形式表示算法
樣例輸入編程
Example 1
Input:
26微信
Output:
"1a"編程語言
Example 2
Input:
-1post
Output:
"ffffffff"ui
解題分析code
❖首先,若是這個數是個正數的話,那麼很是簡單:
只須要考慮十進制數到16進制數的轉換,那麼轉換十六進制只須要用這個數對16^0,16^1,16^2……取餘獲得轉換成16進制後的每一位(還有一點須要注意的是16進制下10~15咱們用a~f表示)。cdn
❖因此這題的關鍵就在於負數的狀況。
負數的二進制補碼錶示
不少人都是知道:
負數在計算機內部的存儲方式是補碼的形式
負數的補碼就等於其正數反碼+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…
推薦閱讀: