逻辑或两个数组中的每个条目

时间:2015-11-12 16:13:31

标签: arrays ruby logic addition

说我有这些

a = [0, 1, 0, 0, 0]
b = [0, 0, 0, 1, 0]

我想要c = a | b之类的东西 得到答案为c = [0, 1, 0, 1, 0]

3 个答案:

答案 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"

要检索位ii=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位设置为1i=1,(现在调用y 0):

y |= (1<<1) #=> 2

同样(y现在等于2),

y |= (1<<9) #=> 514
y.to_s(2)   #=> "1000000010"

答案 2 :(得分:0)

您也可以将数组转换为数字,然后只使用二元运算符,如果需要执行大量此类操作,它应该更快。 如果需要,您可以将结果转换回数组。

git stash