10
votes

Concaténer deux 32 bits Int pour obtenir un 64 bits de long en python

Je veux générer 64 bits de longue dure Int pour servir d'identifiant unique pour les documents.

Une idée est de combiner l'ID de l'utilisateur, qui est un INT 32 bits, avec l'horodatage UNIX, qui est un autre 32 bits int, pour former un entier unique de 64 bits de 64 bits.

Un exemple à l'échelle réduite serait:

combiner deux nombres de 4 bits 0010 et 0101 pour former le numéro 8 bits 00100101 . .

  1. Ce schéma a-t-il un sens?
  2. Si c'est le cas, comment puis-je faire la "concaténation" de nombres dans Python?

1 commentaires

Voici une question associée et une réponse pour que les longueurs de bits des deux numéros d'entrée ne soient pas identiques, ou quand un seul des deux longueurs de bits sont connus.


5 Réponses :


19
votes

Calcuter le premier numéro du premier numéro par le nombre de bits dans le deuxième numéro, puis ajoutez (ou ou - remplacer le bit ou - remplacer + code> avec | code> dans les exemples suivants) Numéro.

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


3 commentaires

Ne pouviez-vous pas utiliser | au lieu de + dans cet exemple?


Il pourrait être sage d'utiliser un masque de bits si l'une des valeurs est jamais> 32 bits.


ASSERT Y <0XFFFFFFFFFF ou Y & = 0XFFFFFFFFF Selon si les numéros plus importants sont autorisés ou non.



4
votes

Cela devrait le faire:

(x << 32) + y


0 commentaires

6
votes
foo = <some int>
bar = <some int>

foobar = (foo << 32) + bar

0 commentaires

2
votes

Pour le prochain gars (qui était moi dans ce cas, c'était moi). Voici une façon de le faire en général (pour l'exemple à la baisse de l'échelle): xxx pré>

pour d'autres tailles change le 4 à un 32 ou autre. P>

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


0 commentaires

1
votes

Aucune des réponses avant cette couverture ne fusionne et fente les chiffres. La scission peut être autant une nécessité comme la fusion.

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)


0 commentaires