2009-09-17 4 views

Répondre

124

Pour obtenir un masque de bits:

var mask = 1 << 5; // gets the 6th bit 

Pour tester si un bit est:

if ((n & mask) != 0) { 
    // bit is set 
} else { 
    // bit is not set 
} 

Pour définir un bit:

n |= mask; 

Pour effacer un peu:

n &= ~mask; 

Pour basculer un peu:

n ^= mask; 

Référez-vous au Javascript bitwise operators.

19

Je veux ajouter des choses (merci à @cletus)

function bit_test(num, bit){ 
    return ((num>>bit) % 2 != 0) 
} 

function bit_set(num, bit){ 
    return num | 1<<bit; 
} 

function bit_clear(num, bit){ 
    return num & ~(1<<bit); 
} 

function bit_toggle(num, bit){ 
    return bit_test(num, bit) ? bit_clear(num, bit) : bit_set(num, bit); 
} 
+1

C'est super merci. Pouvez-vous expliquer pourquoi bit_test fonctionne? Je comprends le bon décalage pour déplacer le bit intéressant vers la position la plus à droite, mais je me perds à essayer de comprendre quelle est la valeur intermédiaire et pourquoi son reste lorsqu'il est divisé par 2 est différent de zéro lorsqu'il est défini. – Raoul

+1

Après avoir mis le bit voulu à la position la plus à droite, vous testez simplement si la nouvelle valeur est altérée (nouvelle valeur% 2! = 0). Un nombre impair aura bit0 = 1 ou bien bit0 = 0 (parce que le poids du bit0 est de 2 à la puissance 0 qui est 1) – UnLoCo

0

J'ai construit une classe BitSet avec l'aide d'informations @cletus:

function BitSet() { 
    this.n = 0; 
} 

BitSet.prototype.set = function(p) { 
    this.n |= (1 << p); 
} 

BitSet.prototype.test = function(p) { 
    return (this.n & (1 << p)) !== 0; 
} 

BitSet.prototype.clear = function(p) { 
    this.n &= ~(1 << p); 
} 

BitSet.prototype.toggle = function(p) { 
    this.n ^= (1 << p); 
} 
Questions connexes