NextLeap

Bit Manipulation Tricks for interviews

Bit Manipulation Tricks for interviews
Bit Magic

Right shift operator is equivalent to division by 2.

You can divide a number by 2 by using the >> operator.

Example :

 16 = 00010000 in binary format
 
 00010000 >> 1 = 00001000
 
 00001000 = 8 in decimal format = 16 / 2

PS : x >> y is equivalent to dividing x with 2^y

Left shift operator is equivalent to multiplication by 2.

You can multiply a number by 2 by using the << operator.

Example :

 16 = 00010000 in binary format
 
 00010000 << 1 = 00100000
 
 00100000 = 32 in decimal format = 16 x 2

PS: x << y is equivalent to multiplying x with 2^y

Use bitwise AND operator to check even or odd number

You can check if a number is Odd or even by using the Modulo Operator. Check out the pseudo code below

if(num % 2 == 0){
   //num is Odd
} else {
 //num is Event
}

An alternate way to check this is by doing a Bitwise & with 1

if(num & 1 == 0) {
   // Number is even
} else {
   // Number is odd
}

This is because the Least Significant Bit for odd numbers is always set. Hence doing an & will always return 1. For even numbers it will always return 0.

Check whether n is a power of 2 or not

If the number is n, then using the formulae n & (n-1) == 0 - you can know if a number is power of two or not.

Here is the explanation for how it works :

Any power of 2 minus 1 is all ones: ( = 111....1 in binary notation)


2 = 2^1.  2-1 = 1 (1 in binary notation)
4 = 2^2.  4-1 = 3 (11 in binary notation)
8 = 2^3.  8-1 = 7 (111 in. binary notation)

Hence doing n & (n-1) will always return 0.

Here are a few examples of the same :

n = 8 (1000 in binary notation)
n - 1 = 7 (0111 in binary notation)
n & (n-1) =  1000 & 0111 = 0000. 
Hence 8 it is a power of 2

n = 16 (10000 in binary notation)
n - 1 = 15 (01111 in binary notation)
n & (n-1) =  10000 & 01111 = 0000. 
Hence 16 it is a power of 2.

n = 17 (10001 in binary notation)
n - 1 = 16 (10000 in binary notation)
n & (n-1) =  10001 & 10000 != 0000. 
Hence 17 it is not a power of 2

Create a number that has only the Kth bit set

Number 1 has its 1st bit set. So take one and left shift (<<) it by k - 1 to set the bit.

//Number with 4th bit set
00000001 << (4 - 1) = 00000001 << 3 = 0001000

//Number with 7th bit set
00000001 << (7 - 1) = 00000001 << 6 = 01000000

Check whether the Kth bit is set or not

We just learnt above to set the bit using the formulae 1 << (k - 1). So to check if this bit is set or not, we can do a Bitwise and to see if that bit is set or not.

Hence using the equation n & (1 << (k - 1)) != 0 one can determine if the is set or not.

//n = 1101010, k = 4
1101010 & (1 << (4 - 1)) = 1101010 & 0001000 = 0001000 => This is not equal to zero and hence the 4th bit is set for this number

//n = 1100010, k = 4
1100010 & (1 << (4 - 1)) = 1100010 & 0001000 = 0000000 => This is equal to zero and hence the 4th bit is not set for this number

Set the Kth bit to 1

As we saw above that 1 << (k - 1) will result in a number whose only bit is set.

Now doing a bitwise OR with the original number will ensure that that bit is set.

//n = 1101010, k = 4
1101010 | (1 << (4 - 1)) = 1101010 | 0001000 = 1101010 => Here the bit was already set. 

//n = 1100010, k = 4
1100010 | (1 << (4 - 1)) = 1100010 | 0001000 = 1101010 => Check the 4th bit, it is set now

Clearing the Kth bit

Step 1 : As we saw above that 1 << (k - 1) will result in a number whose only bit is set.

Step 2 : Doing a bitwise NOT on this ~(1 << (k - 1)) will result in a number where all the bits are set except the bit

Step 3 : Now doing a bitwise AND on this will keep the other bits as same and only clear the bit.

//n = 1101010, k = 4
Step 1 : (1 << (k - 1)) = (1 << (4 - 1)) = 00001000
Step 2 : ~(1 << (k - 1)) = ~(1 << (4 - 1)) = ~(00001000) = 11110111
Step 3 : n & ~(1 << (k - 1)) = 1101010 & 11110111 = 1100010

Toggling the Kth bit

Step 1 : As we saw above that 1 << (k - 1) will result in a number whose only bit is set.

Step 2: Now doing a bitwise XOR on this will keep the other bits as same and only toggle the bit.

//n = 1101010, k = 4
Step 1 : (1 << (k - 1)) = (1 << (4 - 1)) = 00001000
Step 2 : n ^ (1 << (k - 1)) = 1101010 ^ 00001000 = 1100010

Find the total number of bits in a binary representation of a number

Explanation :

for example :

(binary representation of 16 is 10000) => Number of bits = 4 + 1 = 5

(binary representation of 17 is 10001) => Number of bits = 4 + 1 = 5

Alternatively you can use base 10 log function

Explanation :

for example :

(binary representation of 16 is 10000) => Number of bits = 4 + 1 = 5

Number of set bits in a binary representation of a number

Brian Kernighan’s Algorithm : It states that if we perform AND operation of the number with number-1, we actually unset it’s rightmost bit. So keep on doing this until the number becomes zero.

Iterate number = number & (number-1), till number != 0 and increment the counter at each step.

Swap two numbers without using any temporary variable

Use bitwise XOR (^) operator to quickly swap two number without third variable

 // Swap a with b
 a ^= b;
 b ^= a;
 a ^= b;

Finding 1's complements of a number

One's complement of a number is obtained by toggling all bits of a number.

1's complement of "0111" is "1000"
1's complement of "1100" is  "0011" 

You can achieve this by using the unary operator (~)

one's complement = ~(number)

Finding 2's complements of a number

Twos complement of a number is one's complement + 1.

two's complement = ~(number) + 1

Store multiple flags in a single variable

Example when you can use a single variable to keep multiple boolean flags like, isMarried, isStudent, isWorking. Reduces the amount of space you use to store the information.

Find maximum or minimum without if else

min = (y ^ (x ^ y) & -(x < y));

max = (x ^ (x ^ y) & -(x < y))