2015-09-22 2 views
1

J'ai la formule: (court) (0xF800 | (N & 0x7ff)). Avec l'aide de C/CPP/C# j'ai changé le signe des nombres à huit bits (par exemple 1202 nombres à -846). En Python, cette astuce ne fonctionne pas. Comment puis-je obtenir le même résultat?opération avec un bit en python

+0

le numéro est de huit bits, il est onze bits! –

+0

Qu'est-ce que vous essayez d'accomplir? Pourquoi avez-vous besoin de définir les cinq bits supérieurs à 1? Est-ce que vous vous rendez compte qu'avec un court, 0xF800 | (N & 0x7FF) == 0xF800 | N? – zstewart

Répondre

0

Si vous voulez travailler avec C (++) types que vous aurez besoin d'utiliser les struct ou ctypes modules

Cette méthode utilise struct pour emballer l'entier dans une chaîne d'octets, puis le décompresser comme un autre type .

>>> import struct 
>>> N = 1202 
>>> struct.unpack('h', struct.pack('H',0xf800|(N & 0x7ff)))[0] 
-846 

Cette méthode utilise ctypes qui a une représentation interne similaire à ce que vous auriez en C (++)

>>> from ctypes import c_short 
>>> N = 1202 
>>> c_short(0xf800|(N & 0x7ff)).value 
-846 
+0

qu'est-ce qui est plus rapide? ctypes ou struct? –

+0

performance n'est probablement pas le problème important ici, mais plutôt ce que vous allez faire avec les données une fois que vous l'aurez. Si vous ne faites que convertir une valeur à la fois et que vous n'avez pas besoin d'écrire les chaînes d'octets brutes, alors ctypes sera parfait. Sinon, vous voulez probablement struct. –

0

peut-être quelqu'un aura besoin:

De ctypes importer c_short C_short (0xF800 | (N & 0x7ff)). Valeur

2

Les entiers en Python ont une longueur infinie. Pour faire un nombre négatif, vous devez définir le bit du haut, mais il n'y a pas de "top" avec Python - vous ne pouvez pas le faire avec la manipulation de bits. Ce que vous pouvez faire est de convertir un nombre positif en négatif avec soustraction.

bits = 0xf800 | (N & 0x7ff) 
if bits & 0x8000: 
    bits -= 0x10000 

Comme vous le savez déjà le bit supérieur est défini, ce qui simplifie:

bits = (0xf800 | (N & 0x7ff)) - 0x10000