Aller au contenu


Photo
- - - - -

opérations sur les bianires


  • Veuillez vous connecter pour répondre
7 réponses à ce sujet

#1 jojo

jojo

    Membre

  • Membres
  • 19 messages

Posté 02 février 2014 - 09:19

Bonjour

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 olivthill

olivthill

    Membre occasionnel

  • Membres
  • Pip
  • 143 messages
  • Gender:Male
  • Location:Normandie

Posté 02 février 2014 - 09:09

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)

What? D'où ça vient ?
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.

Par contre pour revenir en arrière j'ai vu qu'il fallait appliquer : int num = (int) bite & 0xFF

What? D'où ça vient ?
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 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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
Pour faire l'opération inverse :
  • Tu retranches 1 au nombre singé
  • Tu inverses tous les bits (XOR 0xFF)
Exemple avec -42 : 11010110
Tu retranches 1 : 11010101
Tu inverses les bits : 00101010 : ça te donne bien 42

Mon site internet : http://ferdinandpiette.com/


#4 jojo

jojo

    Membre

  • Membres
  • 19 messages

Posté 02 février 2014 - 10:02

en java pour convertir un nombre signe en nombre non signe :

http://jessicarbrown.com/resources/unsignedtojava.html

#5 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 jojo

jojo

    Membre

  • Membres
  • 19 messages

Posté 02 février 2014 - 11:04

Arg
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/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' /> { 
    return (short)(b & 0xff);
}
 


C'est bien pour convertir en unsigned ça non ?

#7 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 Dagal

Dagal

    Nouveau membre

  • Membres
  • 3 messages

Posté 02 février 2014 - 11:29

Salut,

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




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users