CONVERSION D'UN NOMBRE ENTIER EN SA REPRÉSENTATION BINAIRE

Messages postés
756
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
- - Dernière réponse : cs_Kenavo
Messages postés
756
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
- 3 mai 2006 à 20:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21707-conversion-d-un-nombre-entier-en-sa-representation-binaire

Afficher la suite 
cs_Kenavo
Messages postés
756
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
-
Salut Delphiprog,

Y a juste l'histoire les valeur négatives qui me chagrine ! La représentation d'une valeur négative est le complément à 2 de la valeur absolue.
-1 en binaire sur 32 bits signés s'écrit : 11111111111111111111111111111111 ($FFFFFFFF)
(31 bits significatifs + 1 bit de signe)

Comme il parait compliqué de faire ce complément à 2 sur le resultat chaine, j'ai préféré utiliser la variable Temp pour calculer la représentation non signée de la valeur négative. Euh ! pas très clair ! donc exemple : -1 en 16 bits s'écrit $FFFF en Hexa ou 1111111111111111 en binaire soit 65565 en décimal, soit 2^16(65536) + (-1). C'est cette valeur qui est convertie.

Je te propose cette fonction pour un entier 32 bits :

function IntToBin(const Value: integer; bits: byte = 32): string;
var
Temp: Int64;
i : Integer;
begin
{ Value >0 -> Temp 0 ; Value < 0 -> Temp = 1}
Temp := Integer(value<0);
{ si Value >=0 -> Temp = Value ;
si Value < 0 -> Temp 2^bits - abs(value) 2^bits + Value}
Temp :Temp shl bits + Value; // ça marche pas si bits 64 : débordement
{ selon le principe des divisions successives par 2.
On concatène le dernier reste au résultat obtenu
par la division entière par 2}
for i:=0 to Bits-1 do
begin
Result := IntToStr(Temp mod 2) + Result;
//Le quotient devient le nouveau dividende
Temp := Temp div 2; // ou Temp shr 1;
end;
end;


Kénavo
cs_sbe
Messages postés
2
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
19 novembre 2005
-
Bonjour,

Il y a quand même beaucoup plus simple pour convertir une valeur décimale en binaire.

function DecToBin(Val: LongInt;NbBit:Integer): String;
var
Masque: Longint;
I: Integer;
Etat: String[1];
begin
Masque := 1;
for I := 0 to NbBit-1 do begin
if (Val and Masque)>0 then Etat := '1' else Etat := '0';
if Result = '' then Result := Etat else Result := Etat + Result;
Masque := Masque shl 1;
end;
end;

SBE
c3rb3r3
Messages postés
40
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2006
-
Merci SBE, il est sympa ton bout de fonction ;)
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Le code de SBE ne calcule pas correctment la conversion des nombres négatifs alors que, pour le code de Kenavo, le résultat est correct.
Toutefois, dans les deux cas, leurs codes sources sont meilleurs que le mien même s'ils n'implémentent qu'une partie de la solution en ne se préoccupant pas de la surcharge.
psycho81
Messages postés
88
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
17 février 2008
-
Bonjour,
Je n'ai pas saisi le truc du complément à deux (qui, il me semble sert pour les additions et les soustractions en binaire) , cependant, je vous livre ici ma fonction IntToBin

function GetBit(IntegerValue: Integer;IntegerPosition: Integer):Integer;register;
{
Entrées EAX (IntegerValue) EDX (IntegerPosition)
Sorties EAX
}
asm
{ 1C }mov ECX,EDX // La fonction SHR a besoin du paramètre dans CL
{ 3C }shr EAX,CL // On effectue le décalage
{ 1C }and EAX,$01 // On ne garde que le premier bit
end;

function IntToBin(Value:Integer):ShortString;
var
i:integer;
begin
SetLength(Result,32)
for i := 0 to 31 do
begin
Result[i] = IntToStr(GetBit(Value,31-i));
end;
end;

Il subsiste peut être une petite erreur de syntaxe (je ne dispose pas de mon p'tit Delphi à portée de main pour tester le code. La fonction GetBit cependant est garantie fonctionelle ! Lorsque nous avons un entier qui a pour valeur -1 on obtient "normalement" la forme binaire du registre (je n'ai jamais entendu aprler de complément à deux pour une transformation binaire désolé ... donc mon raisonnement pourrait être erroné)

Bonne prog !