100 votes

Comment définir, effacer et basculer un seul morceau en JavaScript ?

Comment définir, effacer, basculer et vérifier un peu en JavaScript ?

274voto

cletus Points 276888

Pour obtenir un masque de bits :

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

Pour tester si un bit est défini :

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;

Reportez-vous aux opérateurs Javascript bitwise.

37voto

UnLoCo Points 1617

Je veux ajouter quelques choses (avec des remerciements à @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);
}

24voto

Oleksii Trekhleb Points 385

Obtenir le bit

function getBit(number, bitPosition) {
  return (number & (1 << bitPosition)) === 0 ? 0 : 1;
}

Définir le bit

function setBit(number, bitPosition) {
  return number | (1 << bitPosition);
}

Effacer le taillant

function clearBit(number, bitPosition) {
  const mask = ~(1 << bitPosition);
  return number & mask;
}

Mettre à jour le bit

function updateBit(number, bitPosition, bitValue) {
  const bitValueNormalized = bitValue ? 1 : 0;
  const clearMask = ~(1 << bitPosition);
  return (number & clearMask) | (bitValueNormalized << bitPosition);
}

Des exemples ont été tirés du référentiel d'algorithmes et de structures de données JavaScript.

7voto

TekTimmy Points 400

J'ai créé une classe BitSet à l'aide des 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);
}

0voto

AVD Points 57984

Utiliser ^ exclusif ou opérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X