3

10 進数をバイナリ文字列に変換する新しいメソッド Integer#to_bin を作成したいと考えています。#to_bin の引数は桁数です。その桁数になるように、結果の先頭にゼロを埋め込む必要があります。

例:

1.to_bin(4)
#=> "0001"
1.to_bin(3)
#=> "001"
1.to_bin(2)
#=> "01"
7.to_bin(1)
#=> nil
7.to_bin
#=> "111"
etс.

私が試したこと:

class Integer

    def to_bin(number=nil)
        if number == nil
          return self.to_s(2)
        else 
          s = self.to_s(2).size
          e = number-s
          one = '0'
          two = '00'
          three = '000'

        if e==one.size
          one+self.to_s(2)
        elsif e==two.size
          two+self.to_s(2)
        elsif e==three.size
          three+self.to_s(2)
        end
        end
    end
end

整数を先行ゼロで埋められたバイナリ文字列に変換するにはどうすればよいですか?

4

2 に答える 2

33

これを行う適切な方法は、カーネルのsprintfフォーマットを使用することです。

'%03b' % 1 # => "001"
'%03b' % 2 # => "010"
'%03b' % 7 # => "111"

'%08b' % 1 # => "00000001"
'%08b' % 2 # => "00000010"
'%08b' % 7 # => "00000111"

しかし、待ってください。他にもあります!:

'%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"

したがって、Fixnum または Integer を拡張するメソッドを定義するのは簡単で、きれいに行われます。

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"
于 2013-07-03T08:16:32.283 に答える
16

Ruby には、数値を 2 進数に変換するメカニズムが組み込まれています#to_s。つまり、変換先の基数を受け入れます。

30.to_s(2) # => "11110"

左にゼロを埋め込みたい場合:

30.to_s(2).rjust(10, "0") => "0000011110"

これを 2 つを組み合わせた小さなメソッドに拡張できます。

class Fixnum
  def to_bin(width = 1)
    to_s(2).rjust(width, "0")
  end
end

> 1234.to_bin
=> "10011010010"
> 1234.to_bin(20)
=> "00000000010011010010"
于 2013-07-03T08:00:01.390 に答える