diff --git a/DIRECTORY.md b/DIRECTORY.md index c9eaeea..2700569 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -1,4 +1,7 @@ +## Bit Manipulation + * [Power Of Two](https://github.com/TheAlgorithms/Ruby/blob/master/bit_manipulation/power_of_two.rb) + ## Ciphers * [Merkle Hellman Cryptosystem](https://github.com/TheAlgorithms/Ruby/blob/master/ciphers/merkle_hellman_cryptosystem.rb) diff --git a/bit_manipulation/power_of_two.rb b/bit_manipulation/power_of_two.rb new file mode 100644 index 0000000..21a7044 --- /dev/null +++ b/bit_manipulation/power_of_two.rb @@ -0,0 +1,68 @@ +# Power of 2 +# +# Given an integer n, return true if it is a power of two. Otherwise, return false. +# +# An integer n is a power of two, if there exists an integer x such that n == 2^x. +# +# Example 1: +# Input: n = 1 +# Output: true +# Explanation: 2^0 = 1 +# +# Example 2: +# Input: n = 16 +# Output: true +# Explanation: 2^4 = 16 +# +# Example 3: +# Input: n = 3 +# Output: false +# +# Example 4: +# Input: n = 4 +# Output: true +# +# Example 5: +# Input: n = 5 +# Output: false +# +# Constraints: -231 <= n <= 231 - 1 +# @param {Integer} n +# @return {Boolean} +# + +# +# Approach 1: Bitwise operators: Turn off the Rightmost 1-bit +# + +# Note that there are two ways of solving this problem via bitwise operations: +# 1. How to get / isolate the rightmost 1-bit: x & (-x). +# 2. How to turn off (= set to 0) the rightmost 1-bit: x & (x - 1). +# In this approach, we're reproducing item 2. + +# Complexity Analysis +# +# Time complexity: O(1). +# Space complexity: O(1). + +def is_power_of_two(n) + return false if n < 1 + + n & (n - 1) == 0 +end + +n = 1 +# Output: true +puts is_power_of_two(n) +n = 16 +# Output: true +puts is_power_of_two(n) +n = 3 +# Output: false +puts is_power_of_two(n) +n = 4 +# Output: true +puts is_power_of_two(n) +n = 5 +# Output: false +puts is_power_of_two(n) diff --git a/maths/power_of_two.rb b/maths/power_of_two.rb index ffa77cc..f507aa5 100644 --- a/maths/power_of_two.rb +++ b/maths/power_of_two.rb @@ -33,15 +33,15 @@ # Approach 1: Recursion # -# Time Complexity: O(1) +# Time Complexity: O(logn) # def is_power_of_two(n) if n == 1 - return true - elsif n%2 == 0 - is_power_of_two(n/2) + true + elsif n % 2 == 0 + is_power_of_two(n / 2) else - return false + false end end @@ -113,4 +113,4 @@ n = 4 puts is_power_of_two(n) n = 5 # Output: false -puts is_power_of_two(n) \ No newline at end of file +puts is_power_of_two(n)