算法:
这类算法的核心,在于负数的处理,也就是用到补码的转换,num = ((-num)^0xffffffff)+1。
对于不同进制的转换,采用取余数的方式,来进行操作。
对于不同数的转换,利用 a^b 来获取不同的数值,再通过a&(a-1)来将最右边的1清空来操作。
题目1: 数字转换为十六进制 https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/
代码实现:
func toHex(num int) string {
// 利用数组存储16位数
ss := []string{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}
res := ""
a := []string{}
if num ==0 {
return "0"
}
if num <0 {
// 负数转换为正数,采用补码的形式
num = ((-num)^0xffffffff)+1
}
for num != 0 {
// 通过偏移4为的方式来计算每个十六位的数值,八进制的话是0x7
tmp := num&0xf
a = append(a, ss[tmp])
num = num>>4
}
// 这里位数,从左到右是高位到低位,所以要转换
for i:= len(a)-1;i>=0;i-- {
res += a[i]
}
return res
}
执行结果:
题目2:整数转换
https://leetcode-cn.com/problems/convert-integer-lcci/
代码实现:
func convertInteger(A int, B int) int {
// 负数转换成补码
if A < 0 {
A = ((-A)^0xffffffff)+1
}
if B < 0 {
B = ((-B)^0xffffffff)+1
}
t := A^B // 用来计算出A和B不同的位数1
c:=0
for t != 0{
t &= (t-1) // 用来将最右边的1设置为0
c++
}
return c
}
执行结果: