2011-04-26 53 views
21

Aquí tengo una función que convierte decimal a hexadecimal pero la imprime en orden inverso. ¿Cómo lo arreglaría?Python convierte decimal a hexadecimal

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) 
+0

Ver también: [Python: conversión hex siempre dos dígitos] (http://stackoverflow.com/ q/11676864/562769) –

Respuesta

13

Si desea codificar esto por sí mismo en lugar de utilizar la función incorporada hex(), sólo tiene que hacer la llamada recursiva antes de imprimir el dígito actual:

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"), 
+0

¿Realmente crees que esta es una programación eficiente? Esp. cuando hay una función simple hex()? (¡Increíble!) – Apostolos

+0

@Apostolos No, no creo que lo sea. ¿Qué te hace pensar eso? Sin embargo, creo que es útil que el póster original de la pregunta aprenda cómo arreglar su código, aunque no es la solución que recomiendo usar en código "real". –

+0

OK, es suficiente. – Apostolos

27

Esto no es exactamente lo que usted pidió, pero se puede utilizar la función de "hex" en Python:

>>> hex(15) 
'0xf' 
+0

imprimir hex (15); TypeError: el objeto 'str' no se puede llamar – Babbit

+0

@Babbit Entonces estás haciendo algo mal. Probablemente has nombrado un hex variable o algo así. – Zizouz212

0

en lugar de imprimir todo en la función, sólo podría permitir que se devuelve el valor en hexadecimal, y el wha Te quiero con eso.

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)) 

Probablemente haya formas más elegantes de analizar los componentes alfabéticos del hexágono, en lugar de simplemente usar los condicionales.

17

Creo que esta solución es elegante:

def toHex(dec): 
    x = (dec % 16) 
    digits = "ABCDEF" 
    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] 

Esta salida:

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

Qué tal esto:

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

Ejemplo:

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

~ Rich

Al usar -1 en el resultado de split(), esto funcionaría aunque split devolviera una lista de 1 elemento.

+30

+1 o menos: 'hex (dec) [2:]' – Tadeck

13

utilizo

"0x%X" % n 

donde n es el número decimal para convertir.

-1

enfoque no recursivo para convertir decimales a hexadecimal

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 
12

Si '0x' sin prefijo:

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

utilización demás incorporada hex() funtion.

+0

Vea también: [Python: conversión hexadecimal siempre dos dígitos] (http://stackoverflow.com/q/11676864/562769) –

0

Para obtener un valor hexadecimal puro, esto podría ser útil. Se basa en la respuesta de Joe:

def gethex(decimal): 
    return hex(decimal)[2:] 
-1

Esto funciona bastante bien:

def toHex(n): 
    result, remainder = n, [] 
    while result > 0: 
     rem = result%16 
     result = result // 16 
     if rem < 10: 
      remainder.append(str(rem)) 
     else: 
      if rem == 10: 
       remainder.append('A') 
      if rem == 11: 
       remainder.append('B') 
      if rem == 12: 
       remainder.append('C') 
      if rem == 13: 
       remainder.append('D') 
      if rem == 14: 
       remainder.append('E') 
      if rem == 15: 
       remainder.append('F') 
    return ''.join(remainder[::-1]) 
1
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() 

Esta es la más densa que podría hacer para la conversión de decimal a hexadecimal. NOTA: Este es en la versión Python 3.5.1

0

Una versión usando iteración:

def toHex(decimal): 
    hex_str = '' 
    digits = "ABCDEF" 
    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]) 
0
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] 
Cuestiones relacionadas