【问题标题】:Cast a 10 bit unsigned integer to a signed integer in python在python中将10位无符号整数转换为有符号整数
【发布时间】:2014-02-20 13:27:48
【问题描述】:

我有一个 0-1023 范围内的数字列表。我想将它们转换为整数,以便 1023 映射到 -1,1022 映射到 -2 等等。而 0、1、2、...511 保持不变。

我想出了一个简单的方法:

def convert(x):
    return (x - 2**9) % 2**10 - 2**9

有没有更好的方法?

【问题讨论】:

  • 在某些编程语言中,% 运算符为负左操作数生成负(或零)值,因此可以通过将 (x - 2**9) 更改为 (x + 2**9) 使代码更清晰。除此之外,这似乎是一个合理的实现。

标签: python int uint


【解决方案1】:

最简单的解决方案:

def convert(x):
    if x >= 512:
        x -= 1024
    return x

【讨论】:

  • 或者,将三行减为一:return x if x < 512 else x - 1024
  • return x - 1024 * (x >= 512)
  • @rmartinjak,乘以布尔值需要 Python 进行额外的转换,因此该解决方案比其他解决方案要慢一些。您的原始解决方案和 John1024 的解决方案似乎大致相同。不过,我还没有进行任何严格的测试。
【解决方案2】:
def convert(x):
    return x - (x >> 9) * 1024

使用ctypes

from ctypes import c_short

def convert(x):
    return c_short(x << 6).value >> 6

【讨论】:

  • 完美答案,我可能会添加一些解释
【解决方案3】:
 max_uint_value = 512

 def unassigned_to_int(uint):
      return uint - max_uint_value if uint >= max_uint_value else uint

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2012-08-13
    • 2012-01-09
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多