Given a number, check if it is power of 8 or not.

### Approach 1 –

A simple solution would be to calculate log_{8}n for given number n. If it returns an integral value, then we can say that the number is power of 8.

## C++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> #include <cmath> using namespace std; // returns true if n is power_of_8 bool checkPowerof8(unsigned n) { // find log8(n) double i = log(n) / log(8); // return true if log8(n) is an integer return i - trunc(i) < 0.000001; } // main function int main() { unsigned n = 512 * 64; if (checkPowerof8(n)) cout << n << " is power of 8"; else cout << n << " is not a power of 8"; return 0; } |

`Output:`

32768 is power of 8

### Approach 2 –

The given number n is power of 8 if it is power of 2 and its only set bit is present at

`(0, 3, 6, . . .30)`

position.

**How to check for power of 2?**

The expression `(n & (n - 1))`

will unset the rightmost set bit of a number. If the number is power of 2, it has only one bit set and `(n & (n - 1))`

will unset the only set bit. So we can say that `(n & (n - 1))`

returns 0 if n is power of 2 else it is not a power of 2.

We can also the expression `(n & -n) == n`

to check if a positive integer is a power of 2 or not. For more details refer this post.

**How to check position of set bit ?**

To check the position of its set bit we can use `0xB6DB6DB6`

as a mask. The mask `0xB6DB6DB6`

has 0 in all `(0, 3, 6, . . .30)`

position. So if the expression ` !(n & 0xB6DB6DB6) `

is true, position of set bit in n is even.

(0xB6DB6DB6)_{16} = (10110110110110110110110110110110)_{2}

## C++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <bits/stdc++.h> using namespace std; // returns true if n is power_of_8 bool checkPowerof8(unsigned n) { /* for (int i = 1; i < INT_MAX; i = i*8) cout << bitset<32>(i) << endl; */ // return true if n is power of 2 and its only // set bit is present at (0, 3, 6, ... ) position return n && !(n & (n - 1)) && !(n & 0xB6DB6DB6); } // main function int main() { unsigned n = 512; if (checkPowerof8(n)) cout << n << " is power of 8"; else cout << n << " is not a power of 8"; return 0; } |

`Output:`

256 is power of 8

**Exercise:** Check if number is power of 4 or 16 or not.

(Hint – Check the bit pattern)

Use 0xAAAAAAAA mask to check for Power of 4

Use 0xEEEEEEEE mask to check for Power of 16

**Thanks for reading.**

Please use ideone or C++ Shell or any other online compiler link to post code in comments.

Like us? Please spread the word and help us grow. Happy coding 🙂

## Leave a Reply