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

18,881

Solution 1

Left shift the first number by the number of bits in the second number, then add (or bitwise OR - replace + with | in the following examples) the second number.

result = (user_id << 32) + timestamp

With respect to your scaled-down example,

>>> x = 0b0010
>>> y = 0b0101
>>> (x << 4) + y
37
>>> 0b00100101
37
>>>

Solution 2

foo = <some int>
bar = <some int>

foobar = (foo << 32) + bar

Solution 3

This should do it:

(x << 32) + y

Solution 4

For the next guy (which was me in this case was me). Here is one way to do it in general (for the scaled down example):

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

for other sizes change the 4 to a 32 or whatever.

>>> bin(combineBytes(0b0101, 0b0010))
'0b100101'

Solution 5

None of the answers before this cover both merging and splitting the numbers. Splitting can be as much a necessity as merging.

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)
Share:
18,881
José Manuel Ramos
Author by

José Manuel Ramos

Updated on June 08, 2022

Comments

  • José Manuel Ramos
    José Manuel Ramos almost 2 years

    I want to generate 64 bits long int to serve as unique ID's for documents.

    One idea is to combine the user's ID, which is a 32 bit int, with the Unix timestamp, which is another 32 bits int, to form an unique 64 bits long integer.

    A scaled-down example would be:

    Combine two 4-bit numbers 0010 and 0101 to form the 8-bit number 00100101.

    1. Does this scheme make sense?
    2. If it does, how do I do the "concatenation" of numbers in Python?