有符号整数到2的补码十六进制

2024-09-27 23:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个函数来获取有符号整数,使用2的补码转换它,然后返回十六进制值。我知道有一个hex()函数,但我希望能够指定整数的大小。我怎样才能提高代码的质量,我是否遗漏了什么?谢谢!在

#!/usr/bin/python

int8, int16, int32, int64 = 8, 16, 32, 64

def intToHexString(value, bits):
  def getBitmask(bits):
    mask = 0
    for i in range(bits):
      mask = (mask << 1) + 1
    return mask

  if not isinstance(value, (int, long)):
    raise ValueError("'%s' is not an Integer!"%str(value))
  if not isinstance(bits, int) or bits % 2 != 0:
    raise ValueError("Illegal integer size," +
      "value %s must be divisible by 2!"%str(bits))
  result = value
  bitmask = getBitmask(bits)
  halfMask = bitmask >> 1
  minVal, maxVal = -halfMask, halfMask-1
  if not minVal <= result <= maxVal:
    raise ValueError('Out of range: %d <= %d <= %d'
      %(minVal, result, maxVal))
  if value < 0:
    result = ((abs(value) ^ bitmask) + 1) & bitmask
  return '%0*X'%(int(float(bits)/4), result)

if __name__ == '__main__':
  x, y = 280, -54
  print intToHexString(x, int16), intToHexString(y, int8)

此代码应返回值0118CA


Tags: 函数ifvaluenotmaskresultbitsint
1条回答
网友
1楼 · 发布于 2024-09-27 23:17:08

我会这样写:

def int_to_hex_string(value, bits):
    return "{0:0{1}X}".format(value & ((1<<bits) - 1), bits//4)

if __name__ == '__main__':
  x, y = 280, -54
  print(int_to_hex_string(x, 16), int_to_hex_string(y, 8))

我不认为你的类型检查会增加任何东西:如果值不是正确的类型,你会通过不检查得到更合适的“TypeError”,同样,16和8的别名“int16”和“int8”也不会增加太多。在

相关问题 更多 >

    热门问题