【发布时间】:2014-04-20 17:34:45
【问题描述】:
好的,所以我想知道是否可以使用整数位创建一个布尔值数组。例如,如果我想使用 5,即二进制的 101,是否有任何相当简单的方法可以以某种形式得到它:
[true, false, true]
这个想法是,1 为真,0 为假。将它作为一个 0 和 1 的数组就足够了,但 true 和 false 会更可取。
提前感谢您的帮助。
【问题讨论】:
好的,所以我想知道是否可以使用整数位创建一个布尔值数组。例如,如果我想使用 5,即二进制的 101,是否有任何相当简单的方法可以以某种形式得到它:
[true, false, true]
这个想法是,1 为真,0 为假。将它作为一个 0 和 1 的数组就足够了,但 true 和 false 会更可取。
提前感谢您的帮助。
【问题讨论】:
试试这个:
x = 5.to_s(2).split(//).collect do |n|
n == "1"
end
p x
【讨论】:
collect { |n| n == "1" }
.chars而不是.split(//)
这可行:
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]
取决于所需的位顺序。
【讨论】:
查看我对类似问题的回答: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]
【讨论】: