【发布时间】:2014-02-07 12:56:15
【问题描述】:
假设您有一些计数器或其他数据元素需要存储在二进制协议的字段中。该字段自然有一些固定数量的 n 位,并且协议规定您应该存储计数器的 n 个最低有效位,以便它在它太高时回绕大的。一种可能的实现方法实际上是将模数乘以 2 的幂:
field_value = counter % 2 ** n
但这肯定不是最有效的方法,甚至可能不是最容易理解的方法,考虑到规范正在讨论最低有效位并且没有提到模运算。因此,研究替代方案是适当的。一些例子是:
field_value = counter % (1 << n)
field_value = counter & (1 << n) - 1
field_value = counter & ~(-1 << 8)
有经验的 Python 程序员希望在不牺牲太多性能的情况下最大限度地提高代码清晰度来实现此类要求的方式是什么?
这个问题当然没有正确或错误的答案,所以我想用这个问题来收集这个看似微不足道的需求的所有合理实现。答案应列出替代方案,并简要说明在什么情况下最好使用哪种替代方案。
【问题讨论】:
-
这是什么版本的 Python?
-
“规范是在讨论最低有效位,没有提到取模运算。” 没错,但我怀疑它也没有提到
<<或@987654324 @ 或~,所以在这方面它并不比你的任何其他例子差。 -
使其易于理解和阅读。忘记性能。稍后在 Profiler 的帮助下进行优化。
-
只有分析器才能告诉你什么是更快的。如果 python 解释器有任何价值,它就会知道这些类型的转换,并且无论如何都应该为你应用它们。
-
@SimeonVisser Solutions 最好在 2.7 和 3.0 及更高版本中工作。
标签: python integer twos-complement