说我有这些
a = [0, 1, 0, 0, 0]
b = [0, 0, 0, 1, 0]
我想要c = a | b
之类的东西
得到答案为c = [0, 1, 0, 1, 0]
。
答案 0 :(得分:3)
我会做这样的事情:
a = [0, 1, 0, 0, 0]
b = [0, 0, 0, 1, 0]
a.zip(b).map { |a, b| a | b }
#=> [0, 1, 0, 1, 0]
答案 1 :(得分:2)
你正在用一个数组的元素的整数位进行比特,这是一种相当迂回的方式。我建议你直接处理整数:
x = 8
y = 2
注意:
x.to_s(2) #=> "1000"
y.to_s(2) #=> "10"
或者说,
x.to_s(2).rjust(8,"0") #=> "00001000"
y.to_s(2).rjust(8,"0") #=> "00000010"
现在,您可以使用Fixnum#|非常简单地获得所需的结果:
z = x | y #=> 10
让我们确认一下:
z.to_s(2) #=> "1010"
要检索位i
(i=1
),请使用Fixnum#[]:
y[0] #=> 0
y[1] #=> 1
y[2] #=> 0
y[99] #=> 0
要设置位i,您需要使用Fixnum#<<来获取位位置1
i
和所有其他位位置0
的整数:
1 << i
例如:
1 << O #=> 1
1 << 1 #=> 2
1 << 2 #=> 4
或者,你当然可以写:
2**i
要将i
位设置为0
,请使用Fixnum#^(发音为&#34; XOR&#34;)。对于i=1
,
y = y ^ (1<<1) #=> 0
我们可以更紧凑地作为:
y ^= (1<<1)
要将i
位设置为1
,i=1
,(现在调用y
0
):
y |= (1<<1) #=> 2
同样(y
现在等于2
),
y |= (1<<9) #=> 514
y.to_s(2) #=> "1000000010"
答案 2 :(得分:0)
您也可以将数组转换为数字,然后只使用二元运算符,如果需要执行大量此类操作,它应该更快。 如果需要,您可以将结果转换回数组。
git stash