OVH Cloud OVH Cloud

Probleme d'operation logique

6 réponses
Avatar
Ramunt
J'essaye de faire un "ET Logique" entre deux nombres ...
la seule piste serait de les convertir d'abord en binaire, avec la commande
DECBIN
Mais il semblerait que l'opération logique se fasse bit à bit mais en
partant de la gauche ....

Exemple :

$a="10100101";
$b="1111";
echo $a&$b;

devrait donner : "0101" or je trouve "1010"

Quelqu'un aurait il une explication ou une autre méthode ?
Merci d'avance.

6 réponses

Avatar
Etienne SOBOLE
"Ramunt" a écrit dans le message de
news:403253b4$0$29942$
J'essaye de faire un "ET Logique" entre deux nombres ...
la seule piste serait de les convertir d'abord en binaire, avec la
commande

DECBIN


le ET logique fonctionne entre les nombres !!!
donc la conversion en chaine est inutile.

Etienne

Avatar
Bruno Desthuilliers
Ramunt wrote:
J'essaye de faire un "ET Logique" entre deux nombres ...


un "ET logique" ? Tu es sûr ? Ton exemple ressemble plus à un "Bitwise
AND" (on traduit ça comment en français au fait ? "Et bit à bit" ?)

la seule piste serait de les convertir d'abord en binaire, avec la commande
DECBIN


Pourquoi ?
$r = 165 & 15;

fonctionne très bien.

Mais il semblerait que l'opération logique se fasse bit à bit mais en
partant de la gauche ....

Exemple :

$a="10100101";
$b="1111";
echo $a&$b;

devrait donner : "0101" or je trouve "1010"


10100101
&00001111
--------
00000101

10100101
&11110000
--------
10100000

Effectivement, si tu fait un ET bit à bit entre deux chaines,
l'opération se fait de gauche à droite.

Quelqu'un aurait il une explication


Oui :
1/ une chaine se lit de gauche à droite
2/ un ET bit à bit se fait entre deux entiers, pas entre deux chaines !

ou une autre méthode ?


$a = bindec("10100101"); // $a = 165
$b = bindec("1111"); // $b = 15
$c = $a & $b; // $c = 5
echo "c = '" . decbin($c) ."'n";

=> c = '101'

Bref, j'en reviens à la question de départ : pourquoi veux-tu
transformer tes entiers en chaines avant de faire le ET ?-)

HTH
Bruno

Avatar
Olivier Miakinen
J'essaye de faire un "ET Logique" entre deux nombres ...
la seule piste serait de les convertir d'abord en binaire, avec la commande
DECBIN


Je ne vois pas pourquoi :
http://www.php.net/manual/fr/language.operators.bitwise.php

En revanche, tu devrais t'assurer que tes nombres sont bien considérés
comme des entiers et pas comme des chaînes de caractères.

Mais il semblerait que l'opération logique se fasse bit à bit mais en
partant de la gauche ....


D'après la doc, l'opération se fait octet par octet, donc le résultat
que tu constates est normal.

Essaye plutôt de convertir tes nombres en vrais entiers, si ce sont des
chaînes.

Exemple :
$a = "37";
$b = "15";
...
$a = (int) $a;
$b = (int) $b;
$c = $a & $b;

Aussi, laisse une espace entre le '&' et le '$', pour être sûr que PHP
ne confond pas avec les références '&$'.

Avatar
.:' Francisek ':.
"Ramunt" a écrit
J'essaye de faire un "ET Logique" entre deux nombres ...
la seule piste serait de les convertir d'abord en binaire, avec la
commande

DECBIN
Mais il semblerait que l'opération logique se fasse bit à bit mais en
partant de la gauche ....

Exemple :

$a="10100101";
$b="1111";
echo $a&$b;

devrait donner : "0101" or je trouve "1010"

Quelqu'un aurait il une explication ou une autre méthode ?
Merci d'avance.


Ca m'a tout l'air d'être un & binaire entre deux chaines de caractères.
Il faut utiliser des nombres (en base décimale, octale ou hexa) :
$a = 0xA5; // 0xA5 = 10100101b
$b = 0x0F; // 0x0F
echo decbin($a & $b); // affiche le résultat en binaire

Avatar
chichilos

$a="10100101";
$b="1111";
echo $a&$b;

devrait donner : "0101" or je trouve "1010"


Si tu rajoute les 0 devant 1111 ça marche.

$a="10100101";
$b="00001111";

donne 00000101 et en supprimant les 0, 101.

Avatar
Nicklas
Le Tue, 17 Feb 2004 21:15:26 +0000, Ramunt a écrit :

J'essaye de faire un "ET Logique" entre deux nombres ...
la seule piste serait de les convertir d'abord en binaire, avec la commande
DECBIN
Mais il semblerait que l'opération logique se fasse bit à bit mais en
partant de la gauche ....

Quelqu'un aurait il une explication ou une autre méthode ?
Merci d'avance.


Ba c'est simple, déjà tu fais un "&" sur une chaîne de
caractères et non un nombre (qui de plus est un binaire).

Voilà un petit exemple :

<?php
$a = "10100101";
$b = "1111";

$a = intval($a, 2);
$b = intval($b, 2);

printf("%b & %b = %bn", $a, $b, $a & $b);
?>

[ tmp]$ php4 -q script.php
10100101 & 1111 = 101

Tu peux trouver davantage d'info sur mon p'tit site
www.progweb.com

--
Nicklas
ProgWeb - Développer son site Internet
http://www.progweb.com