【问题标题】:Make array of bools out of Ruby integer bits用 Ruby 整数位制作布尔数组
【发布时间】:2014-04-20 17:34:45
【问题描述】:

好的,所以我想知道是否可以使用整数位创建一个布尔值数组。例如,如果我想使用 5,即二进制的 101,是否有任何相当简单的方法可以以某种形式得到它:

[true, false, true]

这个想法是,1 为真,0 为假。将它作为一个 0 和 1 的数组就足够了,但 true 和 false 会更可取。

提前感谢您的帮助。

【问题讨论】:

    标签: ruby arrays binary


    【解决方案1】:

    试试这个:

    x = 5.to_s(2).split(//).collect do |n|
      n == "1"
    end
    
    p x
    

    【讨论】:

    • 或者干脆collect { |n| n == "1" }
    • 你也可以说.chars而不是.split(//)
    【解决方案2】:

    这可行:

    num = 5
    (0...num.bit_length).map { |i| num[i] == 1 }
    #=> [true, false, true]
    

    (0...num.bit_length).map { |i| num[i] == 1 }.reverse
    #=> [true, false, true]
    

    取决于所需的位顺序。

    【讨论】:

      【解决方案3】:

      查看我对类似问题的回答:Looping through bits in an integer

      这里是它的要点:

      在 Ruby 中,Integers(即Bignums 和Fixnums)已经可以像位数组一样被索引。但是,它们不是Enumerable

      但你当然可以解决这个问题:

      class Integer
        include Enumerable
      
        def each
          return to_enum unless block_given?      
          (size*8).times {|i| yield self[i] }
        end
      end
      

      一种稍微不那么侵入性的方法可能是将Integer 表示为一个数组:

      class Integer
        def to_a
          Array.new(size*8, &method(:[]))
        end
      end
      

      然后你可以使用 Ruby 的漂亮的Enumerable 方法:

      5.to_a.map {|b| !b.zero? }
      # => [true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 2011-08-13
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多