mirror of
https://github.com/TheAlgorithms/Ruby
synced 2025-01-16 03:43:19 +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
|
## Ciphers
|
||||||
* [Merkle Hellman Cryptosystem](https://github.com/TheAlgorithms/Ruby/blob/master/ciphers/merkle_hellman_cryptosystem.rb)
|
* [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
|
# Approach 1: Recursion
|
||||||
#
|
#
|
||||||
# Time Complexity: O(1)
|
# Time Complexity: O(logn)
|
||||||
#
|
#
|
||||||
def is_power_of_two(n)
|
def is_power_of_two(n)
|
||||||
if n == 1
|
if n == 1
|
||||||
return true
|
true
|
||||||
elsif n%2 == 0
|
elsif n % 2 == 0
|
||||||
is_power_of_two(n/2)
|
is_power_of_two(n / 2)
|
||||||
else
|
else
|
||||||
return false
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -113,4 +113,4 @@ n = 4
|
||||||
puts is_power_of_two(n)
|
puts is_power_of_two(n)
|
||||||
n = 5
|
n = 5
|
||||||
# Output: false
|
# Output: false
|
||||||
puts is_power_of_two(n)
|
puts is_power_of_two(n)
|
||||||
|
|
Loading…
Reference in a new issue