力扣小白刷题之405题数字转换为十六进制数

题目描述

给定一个整数,编写一个算法将这个数转换为十六进制数。
对于负整数,我们通常采用补码运算方法
注意:

  1. 十六进制中所有字母 (a-f) 都必须是小写
  2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为 0,那么以单个字符 ‘0’ 来表示;对于其他情况,十六进制字符串中的第一个字符将不会是 0 字符。
  3. 给定的数确保在 32 位有符号整数范围内。
  4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

思路

参考:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/solution/zen-yao-zhuan-hua-16jin-zhi-by-vailing/

  • 首先要知道 16 进制数在计算机中是怎么表示的,由于对于16进制一共有 16 个数:(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f),所以我们只需要使用 4 位, 2^4 = 16刚好可以表示 16 个数,所以计算机在内部是用 4 位来表示 16 进制的,0000 表示 0,0001 表示 1,… ,1111表示 f。

  • 所以题目给我们一个 int 型的数字 num,一个 int = 4 字节 = 32 位,所以,这个 32 位数字可以被分割成 8 个 4 位数,所以我们只需要从头到尾每 4 位每 4 位的遍历,每遍历一个 4 位就将其转化为 16 进制的数即可。

  • 这里是做了两个步骤,先转化为 2 进制(由于计算机本身就是二进制存储,所以我们可以直接得到该数字的二进制),再转化为十六进制。

  • 比如对于26 ->二进制为‭00011010‬(前面省略了24个0)所以每4位遍历就变成了0001,1010对于0001 对应16进制中的1,1010对应16进制中的a所以结果就是为1a.

  • 所以对于本题,我们只需要从尾部开始用位运算取出每一个 4 位,再转化为十六进制即可。需要注意的是,前面为 0 的十六进制应该删除。

  • 我们首先需要把数字 num 与 0b1111 (即 15)进行 与运算 就可以取出 num右边 4 位的值,然后把 num 无符号右移 4 位,继续进行 与运算,直到 num == 0(高位 0 项被放弃)

  • 最后把得到的字符序列反转后转换为字符串返回即可。

代码

力扣小白刷题之405题数字转换为十六进制数_第1张图片

问题

  1. 各进制的前后缀:

    1. 0x(0X)是16进制的前缀,后缀是 h/H
    2. 0是8进制的前缀,后缀是 o/O
    3. 0b(0B)是二进制的前缀,后缀是 b/B
    4. 十进制没有前缀,后缀是 d/D
  2. 位运算符:

    1. (>>) :右移运算符,num >> 1,相当于 num 除以 2。按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补 1。符号位不变。如:-1在32位二进制中表示为:11111111 11111111 11111111 11111111-1>>1:按位右移,符号位不变,仍旧得到11111111 11111111 11111111 11111111因此值仍为-1。
    2. (>>>) :二进制右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。无符号右移,忽略符号位扩展,空位都以 0 补齐。
  3. 补码运算

    • 正数的补码 = 原码
    • 负数的补码 = {原码符号位不变} + {数值位按位取反后 + 1}
    • or 负数的补码 = {原码符号位不变} + {数值位从右边数第一个 1 及其右边的 0 保持不变,左边按位取反}
  4. 二进制与十进制转换

    • 十进制转化为二进制:短除法,一直除 2 ,直到商为 0 ,余数从下往上排出来
    • 二进制转化为十进制:权相加法力扣小白刷题之405题数字转换为十六进制数_第2张图片
  5. 二进制与八进制

    • 二进制转八进制:以小数点为分界点每 3 位 合成一位,将这 3 位二进制按权相加
    • 八进制转二进制:一分三

你可能感兴趣的:(补码)