[RESOLU] Opération sur les bits

yannzul
Invité n'ayant pas de compte PHPfrance

19 janv. 2013, 14:31

Bonjour,

J'ai un comportement inattendu avec l'opérateur ^ (ou exclusif). Voici ce que me ressortent les var_dump :
string '0 : 0 ^ 0 = 0' (length=13)
string '1 : 1 ^ 10 = 1' (length=14)
string '2 : 10 ^ 100 = 11' (length=17)
string '3 : 11 ^ 110 = 10' (length=17)
string '4 : 100 ^ 1000 = 90' (length=19)
string '5 : 101 ^ 1010 = 91' (length=19)
string '6 : 110 ^ 1100 = 105' (length=20)
string '7 : 111 ^ 1110 = 108' (length=20)
string '8 : 1000 ^ 10000 = 946' (length=22)
string '9 : 1001 ^ 10010 = 945' (length=22)
string '10 : 1010 ^ 10100 = 935' (length=23)
string '11 : 1011 ^ 10110 = 935' (length=23)
string '12 : 1100 ^ 11000 = 1195' (length=24)
string '13 : 1101 ^ 11010 = 1211' (length=24)
string '14 : 1110 ^ 11100 = 1204' (length=24)
string '15 : 1111 ^ 11110 = 1208' (length=24)
Et voici le code incriminé :
function codeGray($decimal, $longueur) {	// http://fr.wikipedia.org/wiki/Code_de_Gray
	$b = intval(decbin($decimal));
	$c = intval($b.'0');
	$b = intval('0'.$b);
	$s = $b^$c;
	$s = floor($s/10);
	
	var_dump($decimal.' : '.$b.' ^ '.$c.' = '.$s);
	
	$s = str_pad($s, $longueur, 0, STR_PAD_LEFT);
	return $s;
}
Cette fonction prend un decimal, une longueur (de bits) et doit retourner ce decimal en binaire, selon le code de Gray.

Vous remarquerez le comportement inattendu à partir du décimal 4.

Merci de m'avoir lu !

Eléphant du PHP | 120 Messages

19 janv. 2013, 15:31

Les opérateurs sur les bits ne travaillent pas avec des nombres en affichage binaire mais avec des nombres entiers classiques :


Dans ton exemple, tu utilises par exemple 10 XOR 100

10 -> 0001010
100 -> 1100100
_____________
1101110 --> 110

que tu divises bizarrement par 10 ce qui donne 110/10 = 11

yannzul
Invité n'ayant pas de compte PHPfrance

19 janv. 2013, 15:39

En fait, je divise par 10 pour éliminer le bit de poids faible (ça fait partie de la méthode).

Maintenant, ce que tu dis est intéressant. Je dois donc travailler avec les décimaux.

Je reviens sur ce post si j'ai encore un soucis, sinon je marquerais résolu.

Merci beaucoup :)

Petit nouveau ! | 1 Messages

19 janv. 2013, 15:51

Résolu ! (je ne peux pas modifier le titre :( )

Le code, pour ceux que ça pourrait intéresser :
function codeGray($decimal, $longueur) {
	$decimal2 = $decimal * 2;
	$s = $decimal ^ $decimal2;
	
	$s = decbin($s);
	$s = floor($s/10);
	$s = str_pad($s, $longueur, 0, STR_PAD_LEFT);
	return $s;
}