2011-10-28 4 views
2

je tentais de trouver toutes les « classes » sans le modificateur « d'interface », donc je l'ai écrit:Trouver toutes les lignes * sans * un drapeau (SET type de données)

SELECT * FROM classes WHERE modifiers & ~0x80 

0x80 est évidemment l'interface modificateur. Cela a effectivement filtré les "interfaces", mais il a également exclu les classes sans drapeaux. Donc j'ai dû le modifier pour:

SELECT * FROM classes WHERE modifiers=0 OR modifiers & ~0x80 

Est-ce la manière normale de faire cela? Semble drôle que je dois faire 2 contrôles. Ma logique bit à bit pourrait être un peu rouillée.

Répondre

1

Vous sélectionnons des choses où l'un des bits, sauf le bit 8, est 1. Il suffit de test pour le bit étant 0 explicitement: where (modifiers & 0x80) = 0

1

Il serait préférable de masquer (&) de la valeur » Si vous attendez alors, peu importe les autres valeurs (y compris si elles sont nulles). Je suppose (vous ne spécifiez pas) que le interface modifier est le huitième bit.

Par exemple:

SELECT * FROM classes WHERE modifiers &0x80=0x00; 

Donc nous disons que si le 8ème bit n'est pas réglé alors nous sommes bien ... Peu importe ce que les autres bits sont (0 ou 1) cas de test Exemple:

SELECT 0x00 &0x80=0 FROM dual; //True 
SELECT 0x7F &0x80=0 FROM dual; //True 
SELECT 0x80 &0x80=0 FROM dual; //False 
SELECT 0x8F &0x80=0 FROM dual; //False 

(0x00 peut bien sûr être raccourcies à 0 .. juste pour une meilleure lisibilité;))

+0

Ah .. bien sûr! Cela a un sens parfait. Lit bien aussi. – mpen

Questions connexes