AhmedBoudali
Messages postés14Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention13 décembre 2005
-
11 déc. 2005 à 12:37
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 2014
-
13 déc. 2005 à 21:31
Bonjour ,
Je voudrais mettre en oeuvre la compression de Huffman mais je ne trouve pas la fonction tordue qui lit un bit. Quelqu'un a découvert ou rencontré cette solution ?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 11 déc. 2005 à 20:42
j'essayerai d'y penser
petite explication
un and logique fait une comparaison bit à bit entre les 2
membres de l'équation . Pour chaque bit le résultat est 1 si les 2 bits
testés sont égaux à 1.
pour tester un bit particulier X d'un mot V de N bit on utilise un
masque ou l'on met à 1 le Xiéme bit du masque et tous les autres à 0 .
Quand on fait un et logique (and) entre ce mot et le masque tous
les bits à 0 du masque donneront 0 comme résultat si le Xiiéme bit du
mot V égal à 0 nous avons 0 et 1 (du masque) donc le resultat final est
égal à 0 pour tout le mot; maintenant si le Xiiéme bit du mot V eégal à
1 le et logique entre ce bit et celui du masque donne 1 et donc le
résultat final est différent de zéro.
Pour mettre le Xieme bit du masque à 1 j'ai utilisé un décalage à gauche.
Au départ je mets la valeur du masque à 1 (bit 0= 1) puis je décale vers
la gauche ce bit à chaque décalage le bit de droite est mis à 0
cela donne au départ (pour un mot de 8 bits mais c'est valable
également pour un integer de 32 bits)
00000001
au premier décalage à gauche 00000010
au second decalage à gauche 00000100
et ainsi de suite.
noter également que le décalage à gauche est un moyen efficace de multiplier par 2 un nombre au depart
0000 0001 = 1 (0 decalage)
0000 0010 = 2 au 1er décalage
0000 0100 = 4 au 2eme
0000 1000 = 8 au 3eme
....
ceci est valable quelque soit le nombre dans la limite du domaine de validité de l'entier
et attention quand on arrive à la limite
0111 1111 1111 1111 (smallint= 32767) donne
1111 1111 1111 1110 soit ...-2 ( le bit de poids fort est le bit de signe)
par contre la même opération sur un word donnera 65534.
En relisant mon code on aurait pu écrire directement:
function extractbit(valeur:byte;numbit:integer):boolean;
begin
if ( valeur and 1 shl numbit)<> 0 then result: =true else result := false; ; // on decale 1 de numbit vers la gauche et on fait un et logique avec la valeur à tester
renvoie vrai si le bit N° numbit est à 1 faux dans le cas contraire
end;
et ainsi éviter une variable intermédiaire.
@+
jlen
Vous n’avez pas trouvé la réponse que vous recherchez ?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 11 déc. 2005 à 20:55
en complément on peut également un bit particulier dans un mot celà
nécessite 2 méthodes différente suivant que l'on veut mettre à 1 ou
mettre à 0 ce bit
pour mettre à 1 on prépare le masque comme précédemment et on fait un ou logique (or)
un ou logique met à 1 tous les bits à 1 du mot ou du masque soit:
V:= V or masque
pour mettre à 0 un bit il faut faire un et logique avec un 0 dans le
masque. pour préparer le masque on déclare un variable entiere non
signée par exemple
var masque:byte;// mot de 8 bits non signé
masque: =254; //tous les bits à 1 sauf le bit 0;
masque:=masque shl(numbit);// on décale le 0 de numbit
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 13 déc. 2005 à 21:14
-->CptPingu, je te pardonne de n'avoir pas lu tous les post (c'est
vrai qu'ils sont nombreux) mais j'avais corrigé un peu plus loin (enfin
presque):
function extractbit(valeur:byte;numbit:integer):boolean;
begin if ( valeur and 1 shl numbit)<> 0 then result:true else result : false; ; // on decale 1 de numbit vers la gauche et on fait un et logique avec la valeur à tester
renvoie vrai si le bit N° numbit est à 1 faux dans le cas contraire
end;
l'avantage didactique de la premiere version c'est d'être plus facilement comprehensible.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 13 déc. 2005 à 21:31
ça tient au fait que je pratique aussi le C et l'assembleur ( ou
l'on teste soit la carry soit le zero que l'on affecte ensuite au
resultat ) et qu'il vaut mieux être prudent avec eux.
les derniers post ne sont pas l'aboutissement mais une tentative
d'expliquer la manipulation de bits (mais il vaudrait
mieux que j'évite de programmer avant et après une teuf!!
ça limiterait les posts inutiles