好的,所以我想知道是否可以使用它的位从整数创建一个布尔值数组。例如,如果我想使用5,即二进制中的101,那么我是否有任何合理简单的方法可以获得以下形式:
[true, false, true]
这个想法是一个人是真的,零是假的。将它作为一个零和一的数组就足够了,但是真假会更好。
提前感谢您的帮助。
答案 0 :(得分:3)
试试这个:
x = 5.to_s(2).split(//).collect do |n|
n == "1"
end
p x
答案 1 :(得分: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]
取决于所需的位顺序。
答案 2 :(得分:0)
请参阅我的回答类似的问题:Looping through bits in an integer。
这是它的要点:
在Ruby中,
Integer
s(即Bignum
和Fixnum
s)已经被编入索引,就好像它们是位数组一样。但是,它们不是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]