2011-05-13 4 views
4

Je cherche des recommandations sur la façon de faire des maths bit à bit en python.Opérations bit à bit en Python

Le principal problème que j'ai est que les opérateurs de bits de python ont une précision infinie, ce qui signifie que -1 est vraiment "111 ....... 111". Ce n'est pas ce que je veux. Je veux émuler du vrai matériel qui aura une précision fixe, disons 32 bits.

Voici quelques trucs:

1) -n doit retourner un numéro de complément de 32 bits 2 (ce qui est facile à réaliser en prenant les 32 bits inférieurs du -n de précision infinie)

2) n >> 3, devrait être un décalage arithmétique d'un nombre de 32 bits, ce qui signifie que si le bit 31 est '1', alors les bits 31:28 devraient être '1' après le décalage de 3.

+1

Vous pouvez utiliser numpy, il a construit dans les types int32. http://docs.scipy.org/doc/numpy-1.5.x/reference/arrays.scalars.html – GWW

+0

GWW: J'étais sur le point de publier ceci comme réponse. Peut-être que vous aimeriez en faire une réponse vous-même? –

+1

@Sven Marnach: Bien sûr, je peux le poster grâce, je ne savais pas s'il voulait utiliser des bibliothèques externes ou non. – GWW

Répondre

3

Vous pouvez toujours ajouter un masque & ((1<<32) - 1) pour limiter le nombre à 32 bits avant d'effectuer toute opération, par ex.

class Int32(int): 
    def __neg__(self): 
     return Int32(int.__neg__(self) & ((1 << 32) - 1)) 
    def __rshift__(self, other): 
     if self & (-1 << 31): 
      retval = int.__rshift__(int.__sub__(self, 1<<32), other) 
      return Int32(retval & ((1 << 32) - 1)) 
     else: 
      return Int32(int.__rshift__(self, other)) 
    ... 

>>> -Int32(5) 
4294967291 
>>> (-Int32(5)) >> 1 
4294967293 
+0

Cela ne fonctionne pas tout à fait pour l'opérateur >> ? Il va changer 0s au lieu de 1s dans certains cas. –

+0

@Das: Cela peut fonctionner. Voir mise à jour. – kennytm

+0

Ok. Agréable. De toute façon je peux modéliser cette classe? Quelque chose comme Int ? –

6

Vous pouvez utiliser numpy, il a construit en int32 types et bien plus encore.

Questions connexes