[英]Concatenate two 32 bit int to get a 64 bit long in Python
我想生成64位长的int作为文档的唯一ID。
一种想法是将用户的ID(32位int)与Unix时间戳(另一个32位int)组合,以形成唯一的64位长整数。
缩小的例子是:
将两个4位数字0010
和0101
以形成8位数字00100101
。
通过左的比特数在所述第二数量移位的第一个数字,然后添加(或按位或-替换+
与|
在下面的实施例)第二个数字。
result = (user_id << 32) + timestamp
关于缩小的例子,
>>> x = 0b0010
>>> y = 0b0101
>>> (x << 4) + y
37
>>> 0b00100101
37
>>>
foo = <some int>
bar = <some int>
foobar = (foo << 32) + bar
这应该这样做:
(x << 32) + y
对于下一个人(在这种情况下,我就是我)。 这是一般的一种方法(对于缩小的示例):
def combineBytes(*args):
"""
given the bytes of a multi byte number combine into one
pass them in least to most significant
"""
ans = 0
for i, val in enumerate(args):
ans += (val << i*4)
return ans
对于其他尺寸,将4改为32或其他。
>>> bin(combineBytes(0b0101, 0b0010))
'0b100101'
在此之前的答案都不包括合并和拆分数字。 分裂可能与合并一样重要。
NUM_BITS_PER_INT = 4 # Replace with 32, 48, 64, etc. as needed.
MAXINT = (1 << NUM_BITS_PER_INT) - 1
def merge(a, b):
c = (a << NUM_BITS_PER_INT) | b
return c
def split(c):
a = (c >> NUM_BITS_PER_INT) & MAXINT
b = c & MAXINT
return a, b
# Test
EXPECTED_MAX_NUM_BITS = NUM_BITS_PER_INT * 2
for a in range(MAXINT + 1):
for b in range(MAXINT + 1):
c = merge(a, b)
assert c.bit_length() <= EXPECTED_MAX_NUM_BITS
assert (a, b) == split(c)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.