Can anyone suggest me the best code for power of 2 in ruby without using any predefined functions/ methods …
Hello @premila.ande, welcome!
Sorry, actually I didn’t get what you really meant! I mean can you clarify us a bit so we may give your problem a try?
Hi, didn’t get any reply yet.
Anyways, if you want to create a program that check if a number is the power of 2, then:
check = ->(n) { Math.log2(n).then { |x| x.to_i == x } }
a === 16 # => true
a === 32 # => true
a === 63 # => false
Getting power of 2’s up to a given range:
print('Enter max range: ') || puts((1..STDIN.gets.to_i).map { |n| 2 ** n })
If it doesn’t answer your question, please comment.
You can’t do anything in any computer language without using “predefined functions”. Please clarify. A fast and easy way is to check if all bits other than the most significant bit equal zero: def pow_of_2?(n); return false if n.zero?; (n.bit_length-1).times.all? { |i| n[i].zero? }; end
. pow_of_2?(1) #=> true; pow_of_2?(2) #=> true; pow_of_2?(3) #=> false; pow_of_2?(4) #=> true; pow_of_2?(5) #=> false; pow_of_2?(6) #=> false
and so on.
Oh I forgot to add you can you bitshift as well. It’s very very faster compared to **.
But if you need to deal with bigger range, using <<
instead of **
will give you a huge speed boost. In the end, it should look like this:
print('Enter max range: ') || puts((1..STDIN.gets.to_i).map { |n| 1 << n })
Benchmarking
[Warning: This program generates big numbers, and will use around 1.5 GiB of RAM. You may reduce the range to 1…10_000 or something like that if you don’t have that much available memory].