mirror of
https://github.com/TheAlgorithms/Ruby
synced 2024-12-27 21:58:57 +01:00
Merge pull request #104 from TheAlgorithms/vbrazo-patch-1
Power of two: bitwise approach
This commit is contained in:
commit
ceef771b0b
3 changed files with 77 additions and 6 deletions
|
@ -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)
|
||||
|
||||
|
|
68
bit_manipulation/power_of_two.rb
Normal file
68
bit_manipulation/power_of_two.rb
Normal file
|
@ -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)
|
|
@ -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)
|
||||
puts is_power_of_two(n)
|
||||
|
|
Loading…
Reference in a new issue