【问题标题】:Length of hexadecimal number十六进制数的长度
【发布时间】:2013-06-26 10:06:48
【问题描述】:

我们如何在 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 作为十六进制数,但是我的实际数字非常大,需要手动计算。

【问题讨论】:

  • 可以用字符串表示的字母个数吗?
  • “十六进制数的长度”到底是什么意思?你期望0x346 的长度是多少?
  • @DavidJashi - 我想这很明显,再次阅读了这个问题。我一定是想多了。
  • @JustinEthier 我希望长度为 3。
  • Re “显示一些错误”:这并不是什么大惊喜。在带有“a=a/16”和“return i”的两行中,您混合使用了制表符和空格。如果你幸运的话,你可能会侥幸逃脱,但the rules are complicated.

标签: python counting


【解决方案1】:

使用函数hex

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

或使用字符串格式:

>>> len("{:x}".format(b))
3

【讨论】:

    【解决方案2】:

    虽然使用字符串表示作为中间结果有一些简单的优点,但它有点浪费时间和内存。我更喜欢数学解决方案(返回没有任何 0x 前缀的纯数字):

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

    +1 调整考虑了这样一个事实,即要获得数字基数的精确幂,您需要一个前导“1”。

    【讨论】:

    • “有点浪费时间和记忆”——我很怀疑
    • 考虑到这是 python 我怀疑资源的差异很重要。如果它是嵌入式控制器的代码,那么可能。但是 +1 用于超越“明显”的基于字符串的解决方案。
    • 我使用 timeit 模块的测量给出了这些结果:字符串解决方案的运行时间几乎与位数成线性关系,日志解决方案几乎是恒定的。收支平衡约为 240 位数。对于 32 位数字,字符串例程需要一半的时间,对于 1024 位数字,字符串解决方案需要日志解决方案的因子 3。最初的问题提到了 非常大 数字...
    【解决方案3】:

    正如 Ashwini 所写,hex 函数为您完成了艰苦的工作:

    十六进制(x)

    将整数(任意大小)转换为十六进制字符串。结果是一个有效的 Python 表达式。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2011-12-09
      • 2016-10-15
      • 1970-01-01
      • 2013-03-14
      • 2013-08-09
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多