Длина шестнадцатеричного числа

Как мы можем получить длину шестнадцатеричного числа на языке Python? Я пытался использовать этот код, но даже это показывает некоторую ошибку.

i = 0
def hex_len(a):
    if a > 0x0:
        # i = 0
        i = i + 1
        a = a/16
        return i
b = 0x346
print(hex_len(b))

Здесь я просто использовал 346 в качестве шестнадцатеричного числа, но мои настоящие числа очень велики, чтобы их можно было считать вручную.


person Ashray Malhotra    schedule 28.06.2013    source источник
comment
Можете ли вы использовать количество букв строкового представления?   -  person Alex L    schedule 28.06.2013
comment
Что именно вы подразумеваете под длиной шестнадцатеричного числа? Какой вы ожидаете длину 0x346?   -  person Justin Ethier    schedule 28.06.2013
comment
@DavidJashi - я полагаю, теперь это очевидно, когда я снова прочитал вопрос. Должно быть, я слишком много думал.   -  person Justin Ethier    schedule 28.06.2013
comment
@JustinEthier Я ожидаю, что длина будет 3.   -  person Ashray Malhotra    schedule 28.06.2013
comment
Re показывает какую-то ошибку: это не такой уж большой сюрприз. В двух строках с a=a/16 и return i вы использовали смесь табуляции и пробелов. Если вам повезет, вам это сойдет с рук, но правила сложные.   -  person Peter Mortensen    schedule 03.07.2018
comment
Как бы то ни было, существует также ошибка времени выполнения UnboundLocalError: ссылка на локальную переменную 'i' перед назначением.   -  person Peter Mortensen    schedule 03.07.2018


Ответы (3)


Используйте функцию hex:

>>> b = 0x346
>>> hex(b)
'0x346'
>>> len(hex(b))-2
3

или используя форматирование строки:

>>> len("{:x}".format(b))
3
person Ashwini Chaudhary    schedule 28.06.2013

Хотя использование строкового представления в качестве промежуточного результата имеет некоторые преимущества в простоте, это несколько потраченное впустую время и память. Я бы предпочел математическое решение (возвращающее чистое количество цифр без префикса 0x):

from math import ceil, log

def numberLength(n, base=16): 
    return ceil(log(n+1)/log(base))

Корректировка +1 учитывает тот факт, что для точной степени вашей системы счисления вам нужна ведущая "1".

person guidot    schedule 28.06.2013
comment
немного потраченное время и память - я скептически - person Colonel Panic; 28.06.2013
comment
Учитывая, что это python, я сомневаюсь, что разница в ресурсах имеет значение. Если бы это был код встроенного контроллера, то возможно. Но +1 за мысли, выходящие за рамки очевидного решения на основе строк. - person Justin Ethier; 28.06.2013
comment
Мои измерения с использованием модуля timeit дали следующие результаты: строковое решение имеет время выполнения, почти линейное по количеству цифр, логарифмическое решение почти постоянное. Безубыточность составляет около 240-битных чисел. Для 32-битного числа строковой процедуре требуется половина времени, для 1024-битного числа строковое решение требует коэффициента 3 логарифмического решения. В исходном вопросе упоминались очень большие числа... - person guidot; 29.06.2013

Как писал Ашвини, функция hex сделает за вас всю тяжелую работу:

шестнадцатеричный(x)

Преобразование целого числа (любого размера) в шестнадцатеричную строку. Результатом является допустимое выражение Python.

person Justin Ethier    schedule 28.06.2013