公众号:offer多多

V1

2022/02/26阅读:24主题:橙心

【day7】405. 数字转换为十六进制数

题目

【day7】405. 数字转换为十六进制数

  • 给定一个整数,编写一个算法将这个数转换为十六进制数。

  • 对于负整数,我们通常使用 补码运算 方法。

  • 输入:26输出:"1a"

  • 算数位移,其中正数右移左边补0,负数右移左边补1

答案

class Solution
{

public:
     //十进制转整数串化为十六制转字符串
    string toHex(int num)
    
{
        if (num == 0)
            return "0";

        string output;
        string key = "0123456789abcdef";
        unsigned int n = num > 0 ? num : (unsigned int)num;

        //循环8次
        while (n > 0)
        {
            int index = n & 0x000f// 第四位
            output.push_back(key[index]);
            n = n >> 4;
        } //如果负数怎么处理。 这里为什么限制 大于0呢
        reverse(output.begin(), output.end());
        return output;
    }
    //十六进制转字符串化为十进制
    int toInteger(string input)
    
{
        unsigned int num = 0//假设32系统
        //parseUnsignedInt
        //Parses the string argument as an unsigned integer in the radix
        for (char item : input)
        {
            int bit = item >= 'a' ? item - 'a' + 10 : item - '0'//将字符对应的ASCII值转为数值
            num = num * 16 + bit; //why 不考虑溢出问题 num变成负数。
        }
        return (int)num;
    }
};

JAVA

package leetcode;

public class Lc405 {
 public String toHex(int num) {

  // 01 check
  if (num == 0)
   return "0";

  // 02 data
  StringBuilder output = new StringBuilder();
  int lowBit = 0x000f;// 15
  char[] mapHex = new char[] { '0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f' };
  int n = num;

  // 03 time
  //while (n > 0) {
  while (num !=0) {
   //十进制表示 -->十六进制表示
   System.out.println(Integer.toBinaryString(num));
   int decIndex = n & lowBit; 
   // 疑问:获取的后四位吗?怎么变成整数类型,二进制呢?
   //眼睛看到 就是从内存读取到寄存器数据。自动完成数据转换。
   output.append(mapHex[decIndex]);
   //n = n >>4; //死循环了。
   //num >>>= 4;
    System.out.println(Integer.toBinaryString(num));
  }
  //O4 bug -1 ;
  //算术右移(>>):有符号的移位操,右移之后左侧的空位正数用0补充,负数用1补充
  //11111111111111111111111111111111 死循环了。
  //逻辑右移(>>>,无符号移位
  
  return output.reverse().toString();

 }
 public static void main(String[] args)
 
{       
     Lc405 lc =new Lc405();
    // System.out.println(lc.toHex(-5));
     System.out.println(lc.toHex(-1));
     //System.out.println(lc.toHex(26));
 }
}

小思考:为什么java int 是有符号位 ,但是提供无符号移位>>>, 把有符号的当做无符号移动,这导致数据有问题,eg -1;

C语言没有提供,该怎办?

【之前理解全部补 0 是不对的,竟然还有补 1操作 】

  1. 原来存在的问题 右移运算符>>用来把操作数的各个二进制位全部右移若干位(大家都知道)
  • 低位丢弃,高位补 0 或 1。

  • 如果数据的最高位是 0,那么就补 0;

  • 如果最高位是 1,那么就补 1。

  • -1 怎么右移动

(gdb) p/x  -1>>4
$6 = 0xffffffff

(gdb) p/x  -1>>11
$7 = 0xffffffff

(gdb) p/x  -1>>31
$8 = 0xffffffff

2, 必须按照无符号移位方式移动。

(gdb) p/x (unsigned)-1>30 $14 = 0x1

go代码

func toHex(num int) string {
    //01 check  
    if num  == 0 {
        return "0"
    }

    //02 d时间复杂度
    result := make([]byte0)
    // unsgined
    if num < 0 {
    num = math.MaxUint32 + num + 1
   }
    
    //03 空间复杂度
   for num > 0 {
  r := num & 0x000f

  if r < 10 {
   result = append([]byte{byte('0' + r)}, result...)
  } else {
   result = append([]byte{byte('a' + (r - 10))}, result...)
  }
  num = num >>4
 }

 return string(result)
}

分类:

后端

标签:

后端

作者介绍

公众号:offer多多
V1