如何在Ruby中按位和两位字符串?

时间:2017-12-12 19:41:50

标签: ruby bitwise-and

我输入的数据是位串,假设是二进制数,每4个字节:

str  = "11111111010011111111111010000001"
str2 = "11000000000000000000000000000011"

我想使用按位AND组合这两个字符串,就像这样

str & str2 #=> "11000000000000000000000000000001"

我尝试使用str.to_i将两个字符串转换为整数但Ruby将输入视为基数10,而不是基数2:

str.to_i #=> 11111111010011111111111010000001

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

以下代码应该可以满足您的需求:

str  = "11111111010011111111111010000001"
str2 = "11000000000000000000000000000011"

result = str.to_i(2) & str2.to_i(2)

result.to_s(2)
=> "11000000000000000000000000000001"

答案 1 :(得分:3)

您可以使用to_i转换为二进制表示法,并to_s通过将base指定为参数来转换回它。 2是二进制,8是八进制,16是十六进制。

例如这里的通用解决方案:

def binary_add(*items)
  items.map { |i| i.to_i(2) }.reduce(:&).to_s(2)
end

使用map将所有项目转换为整数的位置,然后将这些项目与&组合成一个单数值。然后将该值转换回基数为二的字符串。

可以这样调用:

binary_add(
  "11111111010011111111111010000001",
  "11000000000000000000000000000011"
)

# => "11000000000000000000000000000001"

答案 2 :(得分:2)

不转换为整数:

str.gsub('1') { str2[$~.begin(0)] }
#=> "11000000000000000000000000000001"

它会将1中的每个str替换为str2中的相应字符。

$~返回匹配项及begin索引。

相关问题