## How do you set, clear, and toggle a single bit?

### Question

How do you set, clear, and toggle a bit?

2019/08/22
1
2620
8/22/2019 7:43:32 PM

## Setting a bit

Use the bitwise OR operator (`|`) to set a bit.

``````number |= 1UL << n;
``````

That will set the `n`th bit of `number`. `n` should be zero, if you want to set the `1`st bit and so on upto `n-1`, if you want to set the `n`th bit.

Use `1ULL` if `number` is wider than `unsigned long`; promotion of `1UL << n` doesn't happen until after evaluating `1UL << n` where it's undefined behaviour to shift by more than the width of a `long`. The same applies to all the rest of the examples.

## Clearing a bit

Use the bitwise AND operator (`&`) to clear a bit.

``````number &= ~(1UL << n);
``````

That will clear the `n`th bit of `number`. You must invert the bit string with the bitwise NOT operator (`~`), then AND it.

## Toggling a bit

The XOR operator (`^`) can be used to toggle a bit.

``````number ^= 1UL << n;
``````

That will toggle the `n`th bit of `number`.

## Checking a bit

You didn't ask for this, but I might as well add it.

To check a bit, shift the number n to the right, then bitwise AND it:

``````bit = (number >> n) & 1U;
``````

That will put the value of the `n`th bit of `number` into the variable `bit`.

## Changing the nth bit to x

Setting the `n`th bit to either `1` or `0` can be achieved with the following on a 2's complement C++ implementation:

``````number ^= (-x ^ number) & (1UL << n);
``````

Bit `n` will be set if `x` is `1`, and cleared if `x` is `0`. If `x` has some other value, you get garbage. `x = !!x` will booleanize it to 0 or 1.

To make this independent of 2's complement negation behaviour (where `-1` has all bits set, unlike on a 1's complement or sign/magnitude C++ implementation), use unsigned negation.

``````number ^= (-(unsigned long)x ^ number) & (1UL << n);
``````

or

``````unsigned long newbit = !!x;    // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);
``````

It's generally a good idea to use unsigned types for portable bit manipulation.

or

``````number = (number & ~(1UL << n)) | (x << n);
``````

`(number & ~(1UL << n))` will clear the `n`th bit and `(x << n)` will set the `n`th bit to `x`.

It's also generally a good idea to not to copy/paste code in general and so many people use preprocessor macros (like the community wiki answer further down) or some sort of encapsulation.

2020/06/20
3661
6/20/2020 9:12:55 AM

Using the Standard C++ Library: `std::bitset<N>`.

Or the Boost version: `boost::dynamic_bitset`.

There is no need to roll your own:

``````#include <bitset>
#include <iostream>

int main()
{
std::bitset<5> x;

x[1] = 1;
x[2] = 0;
// Note x[0-4]  valid

std::cout << x << std::endl;
}
``````

``````[Alpha:] > ./a.out
00010
``````

The Boost version allows a runtime sized bitset compared with a standard library compile-time sized bitset.

2018/02/16

The other option is to use bit fields:

``````struct bits {
unsigned int a:1;
unsigned int b:1;
unsigned int c:1;
};

struct bits mybits;
``````

defines a 3-bit field (actually, it's three 1-bit felds). Bit operations now become a bit (haha) simpler:

To set or clear a bit:

``````mybits.b = 1;
mybits.c = 0;
``````

To toggle a bit:

``````mybits.a = !mybits.a;
mybits.b = ~mybits.b;
mybits.c ^= 1;  /* all work */
``````

Checking a bit:

``````if (mybits.c)  //if mybits.c is non zero the next line below will execute
``````

This only works with fixed-size bit fields. Otherwise you have to resort to the bit-twiddling techniques described in previous posts.

2012/11/29

I use macros defined in a header file to handle bit set and clear:

``````/* a=target variable, b=bit number to act upon 0-n */
#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))
#define BIT_CLEAR(a,b) ((a) &= ~(1ULL<<(b)))
#define BIT_FLIP(a,b) ((a) ^= (1ULL<<(b)))
#define BIT_CHECK(a,b) (!!((a) & (1ULL<<(b))))        // '!!' to make sure this returns 0 or 1

#define BITMASK_CHECK_ALL(x,y) (((x) & (y)) == (y))   // warning: evaluates y twice
``````
2018/10/23

It is sometimes worth using an `enum` to name the bits:

``````enum ThingFlags = {
ThingFlag0 = 1 << 0,
ThingFlag1 = 1 << 1,
ThingError = 1 << 8,
}
``````

Then use the names later on. I.e. write

``````thingstate |= ThingFlag1;
thingstate &= ~ThingFlag0;
if (thing & ThingError) {...}
``````

to set, clear and test. This way you hide the magic numbers from the rest of your code.

Other than that I endorse Jeremy's solution.

2013/10/18

## From snip-c.zip's bitops.h:

``````/*
**  Bit set, clear, and test operations
**
**  public domain snippet by Bob Stout
*/

typedef enum {ERROR = -1, FALSE, TRUE} LOGICAL;

#define BOOL(x) (!(!(x)))

#define BitSet(arg,posn) ((arg) | (1L << (posn)))
#define BitClr(arg,posn) ((arg) & ~(1L << (posn)))
#define BitTst(arg,posn) BOOL((arg) & (1L << (posn)))
#define BitFlp(arg,posn) ((arg) ^ (1L << (posn)))
``````

OK, let's analyze things...

The common expression that you seem to be having problems with in all of these is "(1L << (posn))". All this does is create a mask with a single bit on and which will work with any integer type. The "posn" argument specifies the position where you want the bit. If posn==0, then this expression will evaluate to:

``````0000 0000 0000 0000 0000 0000 0000 0001 binary.
``````

If posn==8, it will evaluate to:

``````0000 0000 0000 0000 0000 0001 0000 0000 binary.
``````

In other words, it simply creates a field of 0's with a 1 at the specified position. The only tricky part is in the BitClr() macro where we need to set a single 0 bit in a field of 1's. This is accomplished by using the 1's complement of the same expression as denoted by the tilde (~) operator.

Once the mask is created it's applied to the argument just as you suggest, by use of the bitwise and (&), or (|), and xor (^) operators. Since the mask is of type long, the macros will work just as well on char's, short's, int's, or long's.

The bottom line is that this is a general solution to an entire class of problems. It is, of course, possible and even appropriate to rewrite the equivalent of any of these macros with explicit mask values every time you need one, but why do it? Remember, the macro substitution occurs in the preprocessor and so the generated code will reflect the fact that the values are considered constant by the compiler - i.e. it's just as efficient to use the generalized macros as to "reinvent the wheel" every time you need to do bit manipulation.

Unconvinced? Here's some test code - I used Watcom C with full optimization and without using _cdecl so the resulting disassembly would be as clean as possible:

----[ TEST.C ]----------------------------------------------------------------

``````#define BOOL(x) (!(!(x)))

#define BitSet(arg,posn) ((arg) | (1L << (posn)))
#define BitClr(arg,posn) ((arg) & ~(1L << (posn)))
#define BitTst(arg,posn) BOOL((arg) & (1L << (posn)))
#define BitFlp(arg,posn) ((arg) ^ (1L << (posn)))

int bitmanip(int word)
{
word = BitSet(word, 2);
word = BitSet(word, 7);
word = BitClr(word, 3);
word = BitFlp(word, 9);
return word;
}
``````

----[ TEST.OUT (disassembled) ]-----------------------------------------------

``````Module: C:\BINK\tst.c
Group: 'DGROUP' CONST,CONST2,_DATA,_BSS

Segment: _TEXT  BYTE   00000008 bytes
0000  0c 84             bitmanip_       or      al,84H    ; set bits 2 and 7
0002  80 f4 02                          xor     ah,02H    ; flip bit 9 of EAX (bit 1 of AH)
0005  24 f7                             and     al,0f7H
0007  c3                                ret

No disassembly errors
``````

----[ finis ]-----------------------------------------------------------------

2019/06/08