85 votes

opération au niveau du bit unaire ~ (inverser)

Je suis un peu confus par l'opérateur ~ Le code va ci-dessous :

 a = 1
~a  #-2
b = 15
~b  #-16

Comment fonctionne ~ ?

Je pensais que ~a serait quelque chose comme :

 0001 = a
1110 = ~a 

Pourquoi pas?

74voto

NullUserException Points 42268

Vous avez tout à fait raison. C'est un artefact de la représentation entière du complément à deux.

En 16 bits, 1 est représenté par 0000 0000 0000 0001 . Inversé, vous obtenez 1111 1111 1111 1110 , ce qui est -2. De même, 15 est 0000 0000 0000 1111 . Inversé, vous obtenez 1111 1111 1111 0000 , soit -16.

En général, ~n = -n - 1

23voto

user1919695 Points 121

Il semble que j'ai trouvé une solution plus simple qui fait ce qui est souhaité:

 uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFF

8voto

user1747134 Points 1012

Vous pouvez également utiliser des ints non signés (par exemple du package numpy) pour obtenir le comportement attendu.

 >>> import numpy as np
>>> bin( ~ np.uint8(1))
'0b11111110'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X