opérations sur les bianires
#1
Posté 02 février 2014 - 09:19
Je comprends pas trop un truc sur les opérations en binaire :
Bon déjà j'ai bien compris que pour convertir d'un unsigned byte vers un signed on a juste a appliquer le complément à 2 et donc par exemple : 0010 1010 (42) et on obtiens : 1101 0110 (-42)
Par contre pour revenir en arrière j'ai vu qu'il fallait appliquer : int num = (int) bite & 0xFF
En gros appliquer un AND avec le masque 1111 1111 au nomber signé :
donc je pars de mon byte signé :
1101 0110
& 1111 1111
--------------
1101 0110
Ce qui donne 214
Pourquoi je retrouve pas mon nombre d'origine ?
merci
#2
Posté 02 février 2014 - 09:09
What? D'où ça vient ?Bon déjà j'ai bien compris que pour convertir d'un unsigned byte vers un signed on a juste a appliquer le complément à 2 et donc par exemple : 0010 1010 (42) et on obtiens : 1101 0110 (-42)
Si on veut transformer 42 en -42, alors on fat un complément à 2, d'accord.
Par contre, il ne faut pas dire qu'il s'agit d'une conversion.
La conversion de 42, du type unsigned byte au type signed byte, transforme 0010 1010 en 0010 1010. Autrement dit, 42 s'écrit exactement de la même manière car c'est un nombre positif.
La conversion de -42, du type unsigned byte au type signed byte, n'est pas possible, car -42 n'existe pas avec le type unsigned byte.
What? D'où ça vient ?Par contre pour revenir en arrière j'ai vu qu'il fallait appliquer : int num = (int) bite & 0xFF
Si on applique & 0xFF à un octet, on ne change pas cet octet. Cette opération ne sert à rien.
Si on veut faire l'opposé de -42, alors on refait un complément à 2.
#3
Posté 02 février 2014 - 09:12
Par contre pour revenir en arrière j'ai vu qu'il fallait appliquer : int num = (int) bite & 0xFF
En gros appliquer un AND avec le masque 1111 1111 au nomber signé
Où as-tu vu ça ??
Pour transformer un nombre positif en négatif, avec un complément à 2, il faut :
- Tu inverses tous les bits du nombre, ce qui revient à appliquer un XOR avec 0xFF
- Tu ajoutes 1 au nombre obtenu
- Tu retranches 1 au nombre singé
- Tu inverses tous les bits (XOR 0xFF)
Tu retranches 1 : 11010101
Tu inverses les bits : 00101010 : ça te donne bien 42
Mon site internet : http://ferdinandpiette.com/
#4
Posté 02 février 2014 - 10:02
http://jessicarbrown.com/resources/unsignedtojava.html
#5
Posté 02 février 2014 - 10:36
en java pour convertir un nombre signe en nombre non signe :
http://jessicarbrown...gnedtojava.html
Ce lien n'a rien a voir avec ton problème.
Dans le lien, on cherche à convertir un byte codé sur 8bits en short codé sur 16bits.
Le masque &0xFF sert uniquement à s'assurer que les bits 8 à 16 soient bien à 0.
Mon site internet : http://ferdinandpiette.com/
#6
Posté 02 février 2014 - 11:04
je pige pas
To convert back and forth, you just cast in the to C++ direction. Easy. Code example: (int or short could be used here just as well) public static short toUnsigned(byte <img src='http://www.robot-maker.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' /> { return (short)(b & 0xff); }
C'est bien pour convertir en unsigned ça non ?
#7
Posté 02 février 2014 - 11:11
C'est bien pour convertir en unsigned ça non ?
Non, c'est pour convertir un byte (8bits) en short (16bits).
Il se trouve qu'un byte est toujours non signé. Donc si tu converti un byte en short, ça sera toujours des nombres positifs. D'où le nom de la fonction.
ça ne veut pas dire que la fonction converti du unsigned en signed
Mon site internet : http://ferdinandpiette.com/
#8
Posté 02 février 2014 - 11:29
En effet, vous allez bien avoir un nombre non signé, mais...
Un byte signé est utilisé à la base : de -128 à 127 (ce qui fait bien 256 combinaison)
On réalise un "ET" logique dessus avec la valeur 0x0ff (en hexa), ce qui donne la même valeur, je n'en voit pas trop l'utilité en dehors du fait que l'on gruge le compilateur qui n'aime pas trop les castings entre signé et non signé.
Donc -1 dans un byte donne 1111 1111 en binaire et donnera 0000 0000 1111 1111 dans votre "short", ce qui est bien une valeur "non signée"
J'appelle cela se chatouiller pour se faire rire…
Edit: il faut que le byte soit déclaré signed byte pour avoir le sens que vous inaginez
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users