Search
 
SCRIPT & CODE EXAMPLE
 

CPP

bit masking tricks

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

number |= 1UL << n;
That will set the nth bit of number. n should be zero, if you want to set the 1st bit and so on upto n-1, if you want to set the nth 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 nth 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 nth 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 nth bit of number into the variable bit.

Changing the nth bit to x
Setting the nth 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 nth bit and (x << n) will set the nth 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.
Comment

PREVIOUS NEXT
Code Example
Cpp :: rgb type def 
Cpp :: fname from FString 
Cpp :: codeforces problem 1030A solution 
Cpp :: c++ read entire file into a variable 
Cpp :: how atan work c++ 
Cpp :: recherche recursive le max dans une liste 
Cpp :: c++ Closest Pair of Points | O(nlogn) Implementation 
Cpp :: 41.00 
Cpp :: remove item from layout 
Cpp :: 1822. Sign of the Product of an Array leetcode in c++ 
Cpp :: use textchanged qt cpp 
Cpp :: c++ break statement 
Cpp :: c++ fstream read line write ,creat file program 
Cpp :: c++ optimize big int array 
Cpp :: vector and algorithm 
Cpp :: c++ stoi binary negative number string to decimal 
Cpp :: Types of Conversions- C++ 
Cpp :: viewlist exaple win32 
Cpp :: cpp get keystroke in console only 
Cpp :: library management system project in c++ using array 
Cpp :: c++ to mips assembly converter 
Cpp :: omp multiple reductions 
Cpp :: distinct numbers cses 
Cpp :: ubuntu dotnet create blazorserver linux 
Cpp :: c++ thread id 
Cpp :: my cpp 
Cpp :: cpp cout more than 1 value 
Cpp :: c++ caps lock key 
Cpp :: #defie in c++ 
Cpp :: find a member variable in a vector of objects cpp 
ADD CONTENT
Topic
Content
Source link
Name
2+2 =