2015-04-08 1 views
1

J'utilise du code binaire pour gérer mes écrasements dans ma base de données, mais maintenant je dois rechercher les règles qui correspondent ou non aux règles que j'ai.L'opérateur AND bit-à-bit ne fonctionne pas comme prévu

  • 1 = déverrouiller le titre
  • 2 = déverrouiller desc
  • 4 = prix déverrouillage
  • 8 = déverrouiller stock

Lorsque j'utilise php je tente de l'utiliser comme match de MySQL:

$overwirtes = 5; 

if (decbin($overwirtes) & decbin(1)) 
{ 
    // unlock title 
} 

if (decbin($overwirtes) & decbin(2)) 
{ 
    // unlock desc 
} 

if (decbin($overwirtes) & decbin(4)) 
{ 
    // unlock price 
} 

if (decbin($overwirtes) & decbin(8)) 
{ 
    // unlock stock 
} 

Ce que je m'attends à ce que ce titre et le prix sont débloquer et de sc et stock sont lock, mais quelque chose va mal et php n'acceptera pas binaire comme MySQL, quelqu'un peut-il me dire ce que je fais de mal ici, je suis encore nouveau pour travailler sur le code binaire en tant que règles.

+0

Quel est le code dans les instructions if? – Rizier123

+0

son tableau comme (1 ou 0) est seulement pour illustrer mon problème, :) – ParisNakitaKejser

+0

Supprimer les appels 'decbin()' de la 1,2,4,8 et tout devrait bien fonctionner – Rizier123

Répondre

2

Vous rencontrez un problème "drôle". Et c'est que decbin() renvoie une chaîne.

Maintenant, si les deux opérandes de l'opérateur bitwise AND sont des chaînes, l'opération est préformée avec ASCII values des chaînes.

également une citation du manuel qui montre cela aussi:

Si les deux opérandes pour la &, | et^opérateurs sont chaînes, puis l'opération sera effectuée sur les valeurs ASCII des caractères qui composent les chaînes et le résultat sera une chaîne. Dans tous les autres cas , les deux opérandes seront convertis en entiers et le résultat sera un entier .

Alors qu'est-ce que cela signifie dans votre exemple spécifique?

Prenons la deuxième instruction if:

$overwirtes = 5; 
decbin($overwirtes) & decbin(2) 

ce puits technique doit être évaluée comme suit:

0000 0101 (5) 
0000 0010 (2) 
---------- & 
0000 0000 = 0 (FALSE) 

Mais depuis les deux opérandes sont chaîne l'opérateur de bits et prend les valeurs ASCII les deux chaînes qui seraient ici:

0011 0101 (53) 
0011 0010 (50) 
---------- & 
0011 0000 = "48" (TRUE) 

C'est pourquoi toutes les conditions de votre code sont évaluées comme VRAIES.


Mais maintenant comment résoudre ce problème? Simple, changez simplement 1 opérande de l'opération en entier. Donc, vous pouvez simplement supprimer l'appel decbin() de 1, 2, 4, 8.

Vous pouvez également voir dans le manuel (citation ci-dessus) quand 1 opérande n'est pas une chaîne (ici un entier) que les deux opérandes deviennent implicitement castés en un entier. Et vous recevez également un nombre entier.

Donc, votre code devrait ressembler à ceci:

$overwirtes = 5; 

if (decbin($overwirtes) & 1) 
{ 
    // unlock title 
} 

if (decbin($overwirtes) & 2) 
{ 
    // unlock desc 
} 

if (decbin($overwirtes) & 4) 
{ 
    // unlock price 
} 

if (decbin($overwirtes) & 8) 
{ 
    // unlock stock 
} 
+0

Merci beaucoup pour cette explication sympathique, maintenant je comprends mais encore confus sur PHP ne pas le convertir en "bin" quand je le dis, mais ce que vous dites son fonctionnement comme je l'ai fermé est donc parfait, merci beaucoup :) – ParisNakitaKejser

+0

Cela signifie-t-il que $ overwirtes sera converti en nombre entier en interprétant ses bits comme des chiffres * décimaux *? Ce serait très mauvais. Pourquoi le convertir en chaîne en premier lieu? – harold

+0

@ParisNakitaKejser De rien! – Rizier123