Converting Integers to Binary in Ruby
I am not fond of this approach since I'm sure there's an even more clever and/or compact, Ruby-esque way of accomplishing it. But using your method of loading binary digits into an array, and then joining, what you have can be done in a little more straight-forward fashion:
def to_binary(n)
return "0" if n == 0
r = []
32.times do
if (n & (1 << 31)) != 0
r << 1
else
(r << 0) if r.size > 0
end
n <<= 1
end
r.join
end
Or, using @500_error's suggestion:
def to_binary(n)
if n >= 0
n.to_s(2)
else
31.downto(0).map { |b| n[b] }.join
end
end
The asymmetry to deal with negative versus non-negative is a little annoying, though. You could do something like:
def to_binary(n)
31.downto(0).map { |b| n[b] }.join.sub(/^0*/, "")
end
How to Convert String to Binary in Ruby
There is no notion of "decimal number" or "binary number" in Ruby objects. All there is is numbers (actually all numbers are binary at the low level, and necessary not at a higher level, but that is irrelevant to Ruby objects). "Decimal" or "binary" are only some ways to represent numbers. Therefore, you cannot convert something into a "binary number". All you can do is to convert it to a number.
Ruby Convert integer to binary to integer array of set bits
This would work:
i = 98
(0...i.bit_length).map { |n| i[n] << n }.reject(&:zero?)
#=> [2, 32, 64]
Fixnum#bit_length
returns the position of the highest "1" bitFixnum#[n]
returns the integer's nth bit, i.e.0
or1
Fixnum#<<
shifts the bit to the left.1 << n
is equivalent to 2n
Step by step:
(0...i.bit_length).map { |n| i[n] }
#=> [0, 1, 0, 0, 0, 1, 1]
(0...i.bit_length).map { |n| i[n] << n }
#=> [0, 2, 0, 0, 0, 32, 64]
(0...i.bit_length).map { |n| i[n] << n }.reject(&:zero?)
#=> [2, 32, 64]
You might want to reverse
the result.
Create a decimal to binary converter using Ruby?
Float, as ruby does it, doesn't have a binary representation. If you want to convert between bases you can use to_s by passing the base in as a paramter.
21.to_s(2) #-> 10101
Convert integer to binary string, padded with leading zeros
The appropriate way to do this is to use Kernel's sprintf
formatting:
'%03b' % 1 # => "001"
'%03b' % 2 # => "010"
'%03b' % 7 # => "111"
'%08b' % 1 # => "00000001"
'%08b' % 2 # => "00000010"
'%08b' % 7 # => "00000111"
But wait, there's more!:
'%0*b' % [3, 1] # => "001"
'%0*b' % [3, 2] # => "010"
'%0*b' % [3, 7] # => "111"
'%0*b' % [8, 1] # => "00000001"
'%0*b' % [8, 2] # => "00000010"
'%0*b' % [8, 7] # => "00000111"
So defining a method to extend Fixnum or Integer is easy and cleanly done:
class Integer
def to_bin(width)
'%0*b' % [width, self]
end
end
1.to_bin(8) # => "00000001"
0x55.to_bin(8) # => "01010101"
0xaaa.to_bin(16) # => "0000101010101010"
Convert binary string to hexadecimal in Ruby
You can convert it to an integer first, hinting that the string is binary (to_i(2)
), then to hexadecimal (to_s(16)
"1010".to_i(2).to_s(16) # => 'a'
If you need it in uppercase, you can call upcase
on the resulting string.
Ruby convert int to bin and vice versa
You can use sprintf
:
sprintf("%08b", 127) #=> "01111111"
# ^^^
# |||
# ||+- "b" = format argument as binary number
# |+-- "8" = number of digits
# +--- "0" = pad with 0
Related Topics
Reducing N+1 Queries Using the Bullet and Rspec Gems
What Does @@Variable Mean in Ruby
Rails Keeps Telling Me That It's Not Currently Installed
Rhc Setup Gives Error 'No Such File Dl/Import'
What's the Difference Between a Proc and a Lambda in Ruby
How to Implement Enums in Ruby
Disable Activerecord For Rails 4
In Ruby on Rails, to Extend the String Class, Where Should the Code Be Put In
How to Get Argument Names Using Reflection
Altering the Primary Key in Rails to Be a String
Block Definition - Difference Between Braces and Do-End
How to Install a Gem or Update Rubygems If It Fails With a Permissions Error
Case Statement With Multiple Values in Each 'When' Block