Power of Two

/**
 * @file
 * @brief Implementation to check whether a number is a power of 2 or not.
 *
 * @details
 * This algorithm uses bit manipulation to check if a number is a power of 2 or
 * not.
 *
 * ### Algorithm
 * Let the input number be n, then the bitwise and between n and n-1 will let us
 * know whether the number is power of 2 or not
 *
 * For Example,
 * If N= 32 then N-1 is 31, if we perform bitwise and of these two numbers then
 * the result will be zero, which indicates that it is the power of 2
 * If N=23 then N-1 is 22, if we perform bitwise and of these two numbers then
 * the result will not be zero , which indicates that it is not the power of 2
 * \note This implementation is better than naive recursive or iterative
 * approach.
 *
 * @author [Neha Hasija](https://github.com/neha-hasija17)
 * @author [Rijul.S](https://github.com/Rijul24)
 */

#include <iostream>  /// for IO operations
#include <cassert>   /// for assert


/**
 * @namespace math
 * @brief Mathematical algorithms
 */
namespace math {
/**
 * @brief This function finds whether a number is power of 2 or not
 * @param n value for which we want to check
 * prints the result, as "Yes, the number n is a power of 2" or
 * "No, the number is not a power of 2" without quotes
 * @returns 1 if `n` IS the power of 2
 * @returns 0 if n is NOT a power of 2
 */
int power_of_two(int n) {
    /// result stores the
    /// bitwise and of n and n-1
    int result = n & (n - 1);
    
    if (result == 0) {
        return 1;
    }

    return 0;
}
}  // namespace math

/**
 * @brief Self-test implementations
 * @returns void
 */
static void test() {
    std::cout << "First case testing... \n"; // for n = 32 return 1
    assert(math::power_of_two(32) == 1);
    std::cout << "\nPassed!\n";

    std::cout << "Second case testing... \n"; // for n = 5 return 0
    assert(math::power_of_two(5) == 0);
    std::cout << "\nPassed!\n";

    std::cout << "Third case testing... \n"; // for n = 232 return 0
    assert(math::power_of_two(232) == 0);
    std::cout << "\nPassed!\n";

    std::cout << "\nAll test cases have successfully passed!\n";
}

/**
 * @brief Take user input in the test cases (optional; currently commented)
 * @returns void
 */
void user_input_test() {
    int n = 0; // input from user
    
    std::cout << "Enter a number " << std::endl;
    std::cin >> n; 

    /// function call with @param n
    int result = math::power_of_two(n);
    if (result == 1) {
        std::cout << "Yes, the number " << n << " is a power of 2\n";
    }
    else { 
        std::cout << "No, the number " << n << " is not a power of 2\n";
    }
}

/**
 * @brief Main function
 * @returns 0 on exit
 */
int main() {
    test(); // run self-test implementations

    // uncomment the line below to take user inputs
    //user_input_test();

    return 0;
}
Algerlogo

Β© Alger 2022

About us

We are a group of programmers helping each other build new things, whether it be writing complex encryption programs, or simple ciphers. Our goal is to work together to document and model beautiful, helpful and interesting algorithms using code. We are an open-source community - anyone can contribute. We check each other's work, communicate and collaborate to solve problems. We strive to be welcoming, respectful, yet make sure that our code follows the latest programming guidelines.