Bit arithmetic - Cheat Sheet and Programs
Index
- List of Bitwise operators
- Tips and tricks
- Bitwise hacks for competitive programming
- Problem 1 - Bitwise AND of a range of numbers
- Problem 2 - Ones complement of a number
- Problem 3 - Count the number of 1s in numbers in range 0 to num inclusive
- Problem 4 - Find a missing number in the range 0 to n
List of Bitwise operators
AND | & |
OR | | |
XOR | ^ |
Left shift | « |
Right Shift | » |
NOT | ~ |
Important tips and tricks to remember (the non obvious ones)
Right shift by 1 is division by two. Left shift by 1 is multiplication by 2 (It’s obvious. I know.)
a = 12 >> 1; // a gets value of 6
a = 12 << 1; // a gets value of 24
Bitwise AND(&
) to check if even or add. Checks the LSB (0 is even, 1 is odd)
if (num & 1) cout<<"ODD";
else cout<<"EVEN";
Convert a character to lowercase regardless of what case it is in
ch = ch | ' '
Convert a character to uppercase regrdless of what case it is in
ch = ch & '_'
Swap two variables without a third - using XOR
a = a^b;
b = b^a; // same as b = b ^ a ^ b
a = a^b; // same as a = (a ^ b) ^ (b ^ a ^ b)
Bitwise hacks for competitive programming
Bitwise AND of a range of numbers
The result will be 0 if:- log2(n/m) != 0
<–> log2(n) != log2(m)
. In the below method, m will be equal to n and the loop will break only if the MSB of m and n are the same.
int rangeBitwiseAnd(int m, int n) {
int count = 0;
while(m != n){
m >>= 1;
n >>= 1;
count += 1;
}
return m <<= count;
}
1s complement of a number
Eg. 1 Input: 5 Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
Eg. 2 Input: 1 Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
int findComplement(int num) {
int mask = 1;
while (mask < num) {
mask = (mask << 1) + 1;
}
return mask ^ num;
}
Get count of 1s of all numbers in range [0, num]
Eg. 1 Input: 5 Output: [0,1,1,2,1,2]
We can use inbuilt function: cout<< __builtin_popcount (4);
This is a form of dynamic programming, where we use the value of res[i/2] which will have the same number of 1s as res[num] + (1 if odd, 0 if even)
vector<int> countBits(int num) {
vector<int> res(num + 1, 0);
for (int i = 0; i < num + 1; i++) {
res[i] = res[i >> 1] + (i & 1);
}
return res;
}
Find missing number in an array of n elements in the range of 0 to n.
Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
Eg. 1 Input: [3,0,1] Output: 2
Eg. 2 Input: [9,6,4,2,3,5,7,0,1] Output: 8
cpp
public int missingNumber(int[] nums) { //xor
int res = nums.length;
for(int i=0; i<nums.length; i++){
res ^= i;
res ^= nums[i];
}
return res;
}
bit arithmetic, bit, xor, operators,