On ouvre une fichier BMP 24 bits avec une classe coder par Kirua qui m'a genereusement offert lol. Et avec une classe DecalBit Apres avoir lu le header et mis le codage des pixels dans un tableau decaler les bits un a un a gauche ou a droite de N bit.
<<
>>
Nous ne fesons pas que decaler nous recuperons les bits de poids faible pour les remettres de l'autre coter sinon nous aurons une perte de donner et impossible de recuperer les informations de bases :
Source / Exemple :
// Exemple de decalage de bit a droite avec un octet c et du k:
f = c & ((1 << k) - 1); // Nous recuperons les bits de poids faibles
c >>= k; // Decalons l'octet de k
f <<= (8 - k); // Decalons le bit de poids faible de l'autre coté
c |= f; // Et avec un ou l'ogique nous "melangons" les 2
Conclusion :
Exemple avec l'octet :
1001 1010
Decalage de 2 a droites
Explication
Un decalage a gauche est une multiplication donc 1 << k equivaut a 2^k
1 << k = 0000 0100
(1 << k) - 1 = 0000 0011
Alors le bit de poids faible est :
1001 1010 = c
& 0000 0011 = ((1 << k) - 1)
___________
0000 0010 = f
Decalons notre octet de base a droite de 2
1001 1010 >> 2 = 0010 0110 = c
f <<= (8 - k) <=> f <<= (8 - 2) <=> f <<= 6
f <<= 6 <=> f = 1000 0000
0010 0110
| 1000 0000
___________
1010 0110
Voilà notre bit decaler :p
7 juin 2005 à 09:45
par contre il y a kkes problèmes dans Decal_bit.cpp :
CDecal_bit::dbit :
if(s = 1) // toujours vrai, c'est pas un test ^__^
faute de frappe ?
paramètre (unsigned char& c...
tu passes une référence, donc si on modifie c, on modifie la source, tu devrais sois mettre (const unsigned char& c...
sois ne pas retourner de valeur et modifier c
en fait tu fais de la rotation de bits sur des octets
si je puis me permettre, tu aurais pu faire une seule fonction pour la rotation :
// Decalage en fonction de s (s = 1 a droite sinon a gauche)
unsigned char CDecal_bit::dbit(const unsigned char &c, bool s, int k)
{
k %= 8; // k doit être compris entre 0 et 7 inclus (me suis pas trompé là ;p)
if(s 0) // rotation à gauche rotation à droite de 8 - k
k = 8 - k;
return dbitd(c, k);
}
// Decalage bit droite
unsigned char CDecal_bit::dbitd(const unsigned char &c, int k = 1)
{
return (c >> k) | (c << (8 - k));
}
7 juin 2005 à 09:50
7 juin 2005 à 14:41
7 juin 2005 à 16:20
7 juin 2005 à 16:22
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.