#include <iostream>
unsigned int roundToNextPowerOf2(unsigned int n) {
    if (n == 0) return 1;
    
    n--; // Decrement to handle exact powers of 2 
         // (if n = 8, we return 8, not 16)
         
    /* 
        Use bitwise OR and right shifts to "fill" all bits below the highest set bit. 
        This transforms n into a number where all bits below the highest bit are set to 1.
        For example, if n = 21 (binary 10101), after these operations, it becomes 11111 (binary 31).
    */
    n |= n >> 1;
    n |= n >> 2;
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
    
    return n + 1;
}
int main() {
    unsigned int num = 21;
    
    std::cout << "Next power of 2: " << roundToNextPowerOf2(num) << std::endl;
}
 
 
/*
run:
 
Next power of 2: 32
 
*/