【问题标题】:Python convert decimal to hexPython将十进制转换为十六进制
【发布时间】:2011-08-13 08:47:02
【问题描述】:

我在这里有一个函数可以将十进制转换为十六进制,但它以相反的顺序打印。我该如何解决?

def ChangeHex(n):
    if (n < 0):
        print(0)
    elif (n<=1):
        print(n)
    else:
        x =(n%16)
        if (x < 10):
            print(x), 
        if (x == 10):
            print("A"),
        if (x == 11):
            print("B"),
        if (x == 12):
            print("C"),
        if (x == 13):
            print("D"),
        if (x == 14):
            print("E"),
        if (x == 15):
            print ("F"),
        ChangeHex( n / 16 )

【问题讨论】:

标签: python function decimal hex


【解决方案1】:

这个呢:

hex(dec).split('x')[-1]

例子:

>>> d = 30
>>> hex(d).split('x')[-1]
'1e'

~丰富

通过在 split() 的结果中使用 -1,即使 split 返回一个包含 1 个元素的列表,这也可以工作。

【讨论】:

【解决方案2】:

这并不完全符合您的要求,但您可以在 python 中使用“hex”函数:

>>> hex(15)
'0xf'

【讨论】:

  • 打印十六进制(15); TypeError: 'str' 对象不可调用
  • @Babbit 那你做错了什么。您可能将变量命名为 hex 或其他名称。
【解决方案3】:

如果您想自己编写代码而不是使用内置函数hex(),您可以在打印当前数字之前简单地进行递归调用:

def ChangeHex(n):
    if (n < 0):
        print(0)
    elif (n<=1):
        print n,
    else:
        ChangeHex( n / 16 )
        x =(n%16)
        if (x < 10):
            print(x), 
        if (x == 10):
            print("A"),
        if (x == 11):
            print("B"),
        if (x == 12):
            print("C"),
        if (x == 13):
            print("D"),
        if (x == 14):
            print("E"),
        if (x == 15):
            print ("F"),

【讨论】:

  • @Apostolos 不,我不这么认为。是什么让你这么想的?但是,我认为对于问题的原始发布者来说,学习如何修复他们的代码很有用,即使这不是我建议在“真实”代码中使用的解决方案。
  • ChangeHex( n / 16 ) 或 ChangeHex( n // 16 ) ?
  • @sortas n // 16 在 Python 3 中。这个答案是为 Python 2 编写的,在那个版本中,两者是等价的。 (我试图对问题中的代码进行最小的更改以使其正常工作。)
【解决方案4】:

我认为这个解决方案很优雅:

def toHex(dec):
    digits = "0123456789ABCDEF"
    x = (dec % 16)
    rest = dec // 16
    if (rest == 0):
        return digits[x]
    return toHex(rest) + digits[x]

numbers = [0, 11, 16, 32, 33, 41, 45, 678, 574893]
print [toHex(x) for x in numbers]
print [hex(x) for x in numbers]

这个输出:

['0', 'B', '10', '20', '21', '29', '2D', '2A6', '8C5AD']
['0x0', '0xb', '0x10', '0x20', '0x21', '0x29', '0x2d', '0x2a6', '0x8c5ad']

【讨论】:

    【解决方案5】:

    我用

    "0x%X" % n
    

    其中n 是要转换的十进制数。

    【讨论】:

      【解决方案6】:

      如果没有'0x'前缀:

      '{0:x}'.format(int(dec))
      

      否则使用内置的hex()函数。

      【讨论】:

      【解决方案7】:

      Python 的字符串格式化方法可以采用格式规范。

      十进制二进制

      "{0:b}".format(154)
      '10011010'
      

      十进制八进制

      "{0:o}".format(154)
      '232'
      

      十进制十六进制

      "{0:x}".format(154)
      '9a'
      

      Format spec docs for Python 2

      Format spec docs for Python 3

      【讨论】:

        【解决方案8】:

        如果您需要返回偶数个字符,您可以使用:

        def int_to_hex(nr):
          h = format(int(nr), 'x')
          return '0' + h if len(h) % 2 else h
        

        例子

        int_to_hex(10) # returns: '0a'

        int_to_hex(1000) # returns: '03e8'

        【讨论】:

        • 完美的解决方案,加上例子。谢谢先生。
        【解决方案9】:

        你可以使用这种使用切片的方法

        output = hex(15)[2:]
        

        从输出中删除前 2 个字符 (0x)

        【讨论】:

          【解决方案10】:

          最好编写自己的函数来进行数字系统之间的转换以学习一些东西。对于“真实”代码,我建议使用 Python 的内置转换函数,例如 bin(x)hex(x)int(x)

          【讨论】:

            【解决方案11】:
            def main():
                result = int(input("Enter a whole, positive, number to be converted to hexadecimal: "))
                hexadecimal = ""
                while result != 0:
                    remainder = changeDigit(result % 16)
                    hexadecimal = str(remainder) + hexadecimal
                    result = int(result / 16)
                print(hexadecimal)
            
            def changeDigit(digit):
                decimal =     [10 , 11 , 12 , 13 , 14 , 15 ]
                hexadecimal = ["A", "B", "C", "D", "E", "F"]
                for counter in range(7):
                    if digit == decimal[counter - 1]:
                        digit = hexadecimal[counter - 1]
                return digit
            
            main()
            

            这是我可以将十进制转换为十六进制的最密集的方法。 注意:这是 Python 版本 3.5.1

            【讨论】:

              【解决方案12】:

              除了使用 hex() 内置函数之外,这很好用:

              letters = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F']
              decimal_number = int(input("Enter a number to convert to hex: "))
              print(str(letters[decimal_number//16])+str(letters[decimal_number%16]))
              

              但是,这仅适用于将十进制数转换为 255(给出两位十六进制数)。

              【讨论】:

                【解决方案13】:
                def tohex(dec):
                    x = (dec%16)
                    igits = "0123456789ABCDEF"
                    digits = list(igits)
                    rest = int(dec/16)
                    if (rest == 0):
                        return digits[x]
                    return tohex(rest) + digits[x]
                
                numbers = [0,16,32,48,46,2,55,887]
                hex_ = ["0x"+tohex(i) for i in numbers]
                print(hex_)
                

                【讨论】:

                  【解决方案14】:

                  我最近做了这个python程序来将十进制转换为十六进制,请检查一下。 这是我在堆栈溢出中的第一个答案。

                  decimal = int(input("Enter the Decimal no that you want to convert to Hexadecimal : "))
                  intact = decimal
                  hexadecimal = ''
                  dictionary = {1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7',8:'8',9:'9',10:'A',11:'B',12:'C',13:'D',14:'E',15:'F'}
                  
                  while(decimal!=0):
                      c = decimal%16 
                      hexadecimal =  dictionary[c] + hexadecimal 
                      decimal = int(decimal/16)
                  
                  print(f"{intact} is {hexadecimal} in Hexadecimal")
                  

                  当您执行此代码时,将给出如下输出:

                  输入要转换为十六进制的十进制编号:2766

                  2766 是十六进制的 ACE

                  【讨论】:

                    【解决方案15】:

                    您可以只允许它以十六进制返回值,然后用它做任何您想做的事情,而不是打印函数中的所有内容。

                    def ChangeHex(n):
                        x = (n % 16)
                        c = ""
                        if (x < 10):
                            c = x
                        if (x == 10):
                            c = "A"
                        if (x == 11):
                            c = "B"
                        if (x == 12):
                            c = "C"
                        if (x == 13):
                            c = "D"
                        if (x == 14):
                            c = "E"
                        if (x == 15):
                            c = "F"
                    
                        if (n - x != 0):
                            return ChangeHex(n / 16) + str(c)
                        else:
                            return str(c)
                    
                    print(ChangeHex(52))
                    

                    解析十六进制的字母组件可能有更优雅的方法,而不仅仅是使用条件。

                    【讨论】:

                      【解决方案16】:

                      使用迭代的版本:

                      def toHex(decimal):
                          hex_str = ''
                          digits = "0123456789ABCDEF"
                          if decimal == 0:
                             return '0'
                      
                          while decimal != 0:
                              hex_str += digits[decimal % 16]
                              decimal = decimal // 16
                      
                          return hex_str[::-1] # reverse the string
                      
                      numbers = [0, 16, 20, 45, 255, 456, 789, 1024]
                      print([toHex(x) for x in numbers])
                      print([hex(x) for x in numbers])
                      

                      【讨论】:

                        【解决方案17】:
                        hex_map = {0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9, 10:'A', 11:'B', 12:'C', 13:'D', 14:'E', 15:'F'}
                        
                        def to_hex(n):
                            result = ""
                            if n == 0:
                                return '0'
                            while n != 0:
                                result += str(hex_map[(n % 16)])
                                n = n // 16
                            return '0x'+result[::-1]
                        

                        【讨论】:

                          【解决方案18】:
                          n = eval(input("Enter the number:"))
                          def ChangeHex(n):
                              if (n < 0):
                                  print(0)
                              elif (n<=1):
                                  print(n),
                              else:
                                  ChangeHex( n / 16 )
                                  x =(n%16)
                                  if (x < 10):
                                      print(x), 
                                  if (x == 10):
                                      print("A"),
                                  if (x == 11):
                                      print("B"),
                                  if (x == 12):
                                      print("C"),
                                  if (x == 13):
                                      print("D"),
                                  if (x == 14):
                                      print("E"),
                                  if (x == 15):
                                      print ("F"),
                          

                          【讨论】:

                            【解决方案19】:

                            这是我使用它的最佳方式

                            hex(53350632996854).lstrip("0x").rstrip("L")
                            # lstrip helps remove "0x" from the left  
                            # rstrip helps remove "L" from the right 
                            # L represents a long number
                            

                            示例:

                            >>> decimal = 53350632996854
                            >>> hexadecimal = hex(decimal).lstrip("0x")
                            >>> print(hexadecimal)
                            3085a9873ff6
                            

                            如果需要大写,可以使用“大写功能” 例如:

                            decimal = 53350632996854
                            hexadecimal = hex(decimal).lstrip("0x").upper()
                            print(hexadecimal)
                            3085A9873FF6
                            

                            【讨论】:

                              【解决方案20】:

                              为了使数字按正确的顺序排列,我修改了您的代码,以便为输出提供一个变量。这使您可以按正确的顺序放置字符。

                              s=""
                              def ChangeHex(n):
                                  if (n < 0):
                                      print(0)
                                  elif (n<=1):
                                      print(n)
                                  else:
                                      x =(n%16)
                                      if (x < 10):
                                          s=str(x)+s, 
                                      if (x == 10):
                                          s="A"+s,
                                      if (x == 11):
                                          s="B"+s,
                                      if (x == 12):
                                          s="C"+s,
                                      if (x == 13):
                                          s="D"+s,
                                      if (x == 14):
                                          s="E"+s,
                                      if (x == 15):
                                          s="F"+s,
                                      ChangeHex( n / 16 )        
                              

                              注意:这是在 python 3.7.4 中完成的,因此它可能不适合您。

                              【讨论】:

                                【解决方案21】:

                                将十进制转换为十六进制的非递归方法

                                def to_hex(dec):
                                
                                    hex_str = ''
                                    hex_digits = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
                                    rem = dec % 16
                                
                                    while dec >= rem:
                                        remainder = dec % 16
                                        quotient = dec / 16
                                        if quotient == 0:
                                            hex_str += hex_digits[remainder]
                                        else:
                                            hex_str += str(remainder)
                                        dec = quotient
                                
                                    return hex_str[::-1] # reverse the string
                                

                                【讨论】:

                                  【解决方案22】:
                                  dec = int(input("Enter a number below 256: "))
                                  hex1 = dec // 16
                                  
                                  if hex1 >= 10:
                                      hex1 = hex(dec)
                                  
                                  hex2 = dec % 16
                                  if hex2 >= 10:
                                      hex2 = hex(hex2)
                                  
                                  print(hex1.strip("0x"))
                                  

                                  效果很好。

                                  【讨论】:

                                    【解决方案23】:

                                    此代码不完整/-\最大输入为 159

                                    def DicToHex(lsdthx, number, resault):
                                       bol = True
                                       premier = 0
                                       for i in range(number):
                                          for hx in lsdthx:
                                            if hx <= number:
                                                if number < 16:
                                                    if hx > 9:
                                                        resault += lsdthx[hx]
                                                    else:
                                                        resault += str(lsdthx[hx])
                                                    number -= hx
                                                else:
                                                    while bol:
                                                        if number - 16 >= 0:
                                                            number -= 16
                                                            premier += 1
                                                        else:
                                                            resault += str(premier)
                                                            bol = False
                                          return resault
                                    
                                    dthex = {15:'F', 14:'E', 13:'D', 12:'C', 11:'B', 10:'A', 9:9, 8:8, 7:7,6:6, 5:5, 4:4, 3:3, 2:2, 1:1}
                                    reslt = ''
                                    num = int(input('enter dicimal number : '))
                                    print(DicToHex(dthex, num, reslt))
                                    

                                    【讨论】:

                                    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                                    猜你喜欢
                                    • 2010-12-15
                                    • 1970-01-01
                                    • 2011-07-28
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2018-07-24
                                    • 2018-09-04
                                    相关资源
                                    最近更新 更多