专栏 | 九章算法
网址 | 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…
推荐阅读:
- 网申时, 是否需要 cover letter (求职信) ?
- 2017年最受欢迎的编程语言有哪些?
- HR 揭秘: 10 个挂掉 Offer 的原因
- Google offer 如何谈判?听听 Google recruiter 怎么说!
- 面试遇到做过的题怎么办?
- 冷冻期大揭秘 | Google、FB、Amazon、Linkedin冷冻期
- 面试前如何了解一家IT企业?试试官方技术博客!
- 北美IT企业intern薪资大曝光
- 16个behavior question 的面试官解析及tips
- Google晋升机制 | 大公司如何升级打怪, 获得晋升?
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
