繁体   English   中英

连接两个32位int以在Python中获得64位长

[英]Concatenate two 32 bit int to get a 64 bit long in Python

我想生成64位长的int作为文档的唯一ID。

一种想法是将用户的ID(32位int)与Unix时间戳(另一个32位int)组合,以形成唯一的64位长整数。

缩小的例子是:

将两个4位数字00100101以形成8位数字00100101

  1. 这个方案有意义吗?
  2. 如果是这样,我如何在Python中进行数字的“连接”?

通过左的比特数在所述第二数量移位的第一个数字,然后添加(或按位或-替换+|在下面的实施例)第二个数字。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM