Merge branch 'master' into check_amicable_pair

This commit is contained in:
David Leal 2023-06-23 14:04:13 -06:00 committed by GitHub
commit 0a19d1add5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 104 additions and 3 deletions

View File

@ -1,8 +1,5 @@
name: Directory writer
on:
push:
branches:
- main
schedule:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)

View File

@ -20,6 +20,7 @@
* [Count Of Trailing Ciphers In Factorial N](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/count_of_trailing_ciphers_in_factorial_n.cpp)
* [Find Non Repeating Number](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/find_non_repeating_number.cpp)
* [Hamming Distance](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/hamming_distance.cpp)
* [next higher number with same number of set bits](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/next_higher_number_with_same_number_of_set_bits.cpp)
* [Power Of 2](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/power_of_2.cpp)
* [Set Kth Bit](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/set_kth_bit.cpp)
* [Travelling Salesman Using Bit Manipulation](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/bit_manipulation/travelling_salesman_using_bit_manipulation.cpp)

View File

@ -0,0 +1,103 @@
/**
* @file
* @brief [Next higher number with same number of set bits]
* (https://www.geeksforgeeks.org/next-higher-number-with-same-number-of-set-bits/)
* implementation
*
* @details
* Given a number x, find next number with same number of 1 bits in its binary representation.
* For example, consider x = 12, whose binary representation is 1100 (excluding leading zeros on 32 bit machine).
* It contains two logic 1 bits. The next higher number with two logic 1 bits is 17 (100012).
*
* A binary number consists of two digits. They are 0 & 1. Digit 1 is known as
* set bit in computer terms.
* @author [Kunal Nayak](https://github.com/Kunal766)
*/
#include <cassert> /// for assert
#include <iostream> /// for IO operations
/**
* @namespace bit_manipulation
* @brief Bit manipulation algorithms
*/
namespace bit_manipulation {
/**
* @brief The main function implements checking the next number
* @param x the number that will be calculated
* @returns a number
*/
uint64_t next_higher_number(uint64_t x)
{
uint64_t rightOne;
uint64_t nextHigherOneBit;
uint64_t rightOnesPattern;
uint64_t next = 0;
if(x)
{
// right most set bit
rightOne = x & -(signed)x;
// reset the pattern and set next higher bit
// left part of x will be here
nextHigherOneBit = x + rightOne;
// nextHigherOneBit is now part [D] of the above explanation.
// isolate the pattern
rightOnesPattern = x ^ nextHigherOneBit;
// right adjust pattern
rightOnesPattern = (rightOnesPattern)/rightOne;
// correction factor
rightOnesPattern >>= 2;
// rightOnesPattern is now part [A] of the above explanation.
// integrate new pattern (Add [D] and [A])
next = nextHigherOneBit | rightOnesPattern;
}
return next;
}
} // namespace bit_manipulation
/**
* @brief Self-test implementations
* @returns void
*/
static void test() {
// x = 4 return 8
assert(bit_manipulation::next_higher_number(4) == 8);
// x = 6 return 9
assert(bit_manipulation::next_higher_number(6) == 9);
// x = 13 return 14
assert(bit_manipulation::next_higher_number(13) == 14);
// x = 64 return 128
assert(bit_manipulation::next_higher_number(64) == 128);
// x = 15 return 23
assert(bit_manipulation::next_higher_number(15) == 23);
// x= 32 return 64
assert(bit_manipulation::next_higher_number(32) == 64);
// x = 97 return 98
assert(bit_manipulation::next_higher_number(97) == 98);
// x = 1024 return 2048
assert(bit_manipulation::next_higher_number(1024) == 2048);
std::cout << "All test cases have successfully passed!" << std::endl;
}
/**
* @brief Main function
* @returns 0 on exit
*/
int main() {
test(); // run self-test implementations
return 0;
}