2010-08-24 15 views
4

Je veux générer 64 bits int long pour servir d'ID uniques pour les documents. Une idée consiste à combiner l'ID de l'utilisateur, qui est un entier de 32 bits, avec l'horodatage Unix, qui est un autre entier de 32 bits, pour former un entier long unique de 64 bits.Comment "concaténer" deux int de 32 bits pour obtenir une longueur de 64 bits en Python?

Un exemple à échelle réduite serait:

combiner deux nombres de 4 bits 0010 et 0101 pour former le nombre de 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" des nombres en Python?
+0

Venez, le maître n'aime pas attendre. Décaler! –

Répondre

10

décalage vers la gauche du premier nombre par le nombre de bits du deuxième nombre, puis ajouter (ou au niveau du bit OU - remplacer + avec | dans les exemples suivants), le deuxième nombre.

result = (user_id << 32) + timestamp 

En ce qui concerne votre exemple à échelle réduite,

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

Impossible d'utiliser | au lieu de + dans cet exemple? –

+0

Oui, vous pourriez - noté. – sykora

+0

Il peut être judicieux d'utiliser un masque de bits si l'une des valeurs est toujours> 32 bits. – Moberg

4

Cela devrait le faire:

(x << 32) + y 
5
foo = <some int> 
bar = <some int> 

foobar = (foo << 32) + bar 
2

Pour le gars à côté (qui était moi dans ce cas était moi). Voici une façon de le faire en général (pour l'exemple réduite):

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 

pour d'autres tailles changer le 4 à 32 ou autre.

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