bit-wise opération unaire ~ (inverser)
Je suis un peu confus par la ~
de l'opérateur. Code de passe ci-dessous:
a = 1
~a #-2
b = 15
~b #-16
Comment ~
faire le travail?
J'ai pensé, ~a
serait quelque chose comme:
0001 = a
1110 = ~a
pourquoi pas?
- Par exemple: stackoverflow.com/questions/3027394/....
Vous devez vous connecter pour publier un commentaire.
Vous êtes au bon endroit. Il s'agit d'un artefact de en complément à deux représentation entière.
En 16 bits, 1 est représenté comme
0000 0000 0000 0001
. Inversé, vous obtenez1111 1111 1111 1110
, qui est de -2. De même, 15 est0000 0000 0000 1111
. Inversé, vous obtenez1111 1111 1111 0000
, qui est de -16.En général,
~n = -n - 1
Le '~' opérateur est défini comme:
"Le bit d'inversion de x est définie comme(x+1). Elle ne s'applique qu'à l'intégrale des numéros."Python Doc - 5.5
La partie importante de cette phrase est que cela est lié à "l'ensemble des nombres" (également appelé entiers). Votre exemple représente un 4 nombre de bits.
De l'intervalle entier de 4 bits est '-8..0..7'. Sur l'autre main, vous pouvez utiliser 'des entiers non signés", qui ne comprennent pas de nombre négatif et la gamme pour votre 4 nombre de bits serait "0..15'.
Depuis Python fonctionne sur des entiers le comportement que vous avez décrit est prévu. Les entiers sont représentés en utilisant en complément à deux. Dans le cas d'une 4 nombre de bits cela ressemble à la suivante.
Python utilise 32 bits pour la représentation entière dans le cas où vous avez un 32-bit OS. Vous pouvez vérifier le plus grand entier avec:
Dans le cas où vous souhaitez un entier non signé est retourné pour vous 4 nombre de bits que vous avez à masque.
Si vous voulez obtenir un entier non signé de 8 bits (0..255), au lieu juste utiliser:
Il semble que j'ai trouvé plus simple solution qui répond à ce qui est souhaité:
Vous pouvez aussi utiliser des entiers non signés (par exemple à partir de la numpy package) pour obtenir le comportement attendu.
Python unaire inversion de l'opérateur ~x = -(x+1), et ce est le même que le retournement chaque bit dans la mémoire:
par exemple
-0b111
est1|001
dans la mémoire. Vous ne devriez pas interpréter un -ve nombre binaire de représentation de ce qui est stocké dans la mémoire, contrairement à un positive nombre binaire.‡ Remarque: les nombres Négatifs en binaire compter à rebours, de sorte que chaque -ve position de bit n'est pris en compte pour la composition de la int si c'est 0, et vous devez ajouter de -1 au résultat final: