【问题标题】:Convert integer to binary string, padded with leading zeros将整数转换为二进制字符串,用前导零填充
【发布时间】:2013-07-03 07:51:19
【问题描述】:

我想创建将十进制转换为二进制字符串的新方法 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

如何将整数转换为用前导零填充的二进制字符串?

【问题讨论】:

  • 抱歉,你想做什么?
  • 十进制转二进制
  • to_s(2) 不工作吗?
  • 不,您不是在尝试转换十进制;到斌,你试着做一些黑魔法。我在问那究竟是什么。 (将 dec 转换为 bin to_s(2) 就足够了)
  • 我想用零添加左填充

标签: ruby-on-rails ruby


【解决方案1】:

执行此操作的适当方法是使用内核的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"

【讨论】:

    【解决方案2】:

    Ruby 已经具有将数字转换为二进制的内置机制:#to_s 接受要转换为的基数。

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

    如果你想用零填充它:

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

    您可以将其扩展为一种结合两者的小方法:

    class Fixnum
      def to_bin(width = 1)
        to_s(2).rjust(width, "0")
      end
    end
    
    > 1234.to_bin
    => "10011010010"
    > 1234.to_bin(20)
    => "00000000010011010010"
    

    【讨论】:

    • String#rjust 会更干净一些 - 30.to_s(2).rjust(10, "0")
    • 啊,好点子。我一直在寻找#format,因为我知道有一些方法可以将字符串作为接收者进行右对齐!
    • 这不会给nil7.to_bin(1)
    • 我认为这是一个错误,因为据我所知,它实际上并没有在需求中指定。
    • 看起来预期的行为是在给定参数并且小于填充前的二进制字符串长度时返回nil。此外,当参数不是 1、2 或 3 时,OPs 代码返回 nil。我不确定这是否是有意的。但是这个问题的措辞很糟糕。这主要是OP的错。
    猜你喜欢
    • 2014-03-18
    • 2014-07-17
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2014-08-03
    • 2016-02-18
    • 2012-02-27
    相关资源
    最近更新 更多