105

How to set, clear, toggle and check a bit in JavaScript?

1
  • @user JavaScript and C/C++ are different languages. Very helpful to have different answers from them both. Commented Mar 9, 2017 at 20:00

4 Answers 4

283

To get a bit mask:

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

To test if a bit is set:

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

To set a bit:

n |= mask;

To clear a bit:

n &= ~mask;

To toggle a bit:

n ^= mask;

Refer to the Javascript bitwise operators.

Sign up to request clarification or add additional context in comments.

Comments

39

I want to add some things (with thanks to @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);
}

5 Comments

This is great thanks. Can you explain why bit_test works? I understand the right shift to move the interesting bit to the rightmost position, but I get lost trying to understand what the intermediate value is and why its remainder when divided by 2 is nonzero when set.
After you get the wanted bit to rightmost position, you simply test if the new value is impair (new_value % 2 != 0). An impair number will have bit0 = 1 or else bit0 = 0 (because bit0 weight is 2 to power 0 which is 1)
I think "impair" should be "odd" (1, 3, 5, 7, ...).
Yes, I have a french background. I used the french word for "odd" (couldn't edit to correct my comment)
Do you have similar functions for testing numbers beyond the 32-bit range?
26

Get Bit

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

Set Bit

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

Clear Bit

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

Update Bit

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

Examples has been taken from JavaScript Algorithms and Data Structures repository.

1 Comment

Thanks, the descriptive variable names really helped, why do you do res === 0 ? 0 : 1; in the get bit though, instead of just returning the bits?
7

I built a BitSet class with the help of @cletus information:

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);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.