From 24acbadd4fba4df00cfac390ba9c5b2fefbb9285 Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Fri, 19 Mar 2021 20:56:58 -0700 Subject: [PATCH 1/4] Add bitwise approach --- maths/power_of_two.rb | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/maths/power_of_two.rb b/maths/power_of_two.rb index ffa77cc..5d514be 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,35 @@ 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) + +# +# Approach 4: Bitwise operators: Turn off the Rightmost 1-bit +# + +# 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) From b28aa0a2522869f322fa7012d7d623b31721471c Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Fri, 19 Mar 2021 20:59:40 -0700 Subject: [PATCH 2/4] Update power_of_two.rb --- maths/power_of_two.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/maths/power_of_two.rb b/maths/power_of_two.rb index 5d514be..2eb24a8 100644 --- a/maths/power_of_two.rb +++ b/maths/power_of_two.rb @@ -119,6 +119,11 @@ puts is_power_of_two(n) # Approach 4: 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). From d9273de377944a83d398fc1418b4ffc1a0813ad0 Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Sat, 20 Mar 2021 09:52:46 -0700 Subject: [PATCH 3/4] Add bit manipulation folder and move power of two algorithm --- bit_manipulation/power_of_two.rb | 68 ++++++++++++++++++++++++++++++++ maths/power_of_two.rb | 36 ----------------- 2 files changed, 68 insertions(+), 36 deletions(-) create mode 100644 bit_manipulation/power_of_two.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 2eb24a8..f507aa5 100644 --- a/maths/power_of_two.rb +++ b/maths/power_of_two.rb @@ -114,39 +114,3 @@ puts is_power_of_two(n) n = 5 # Output: false puts is_power_of_two(n) - -# -# Approach 4: 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) From fbb06b13327285b25ef094d23d5f7e415903cc22 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Sat, 20 Mar 2021 16:53:02 +0000 Subject: [PATCH 4/4] updating DIRECTORY.md --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) 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)