算法篇:数的转换

时间:2022-07-25
本文章向大家介绍算法篇:数的转换,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

算法:

这类算法的核心,在于负数的处理,也就是用到补码的转换,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
}

执行结果: