【问题标题】:How to bitwise AND two bit strings in Ruby?如何在 Ruby 中按位与两个位字符串?
【发布时间】:2018-05-26 14:16:38
【问题描述】:

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

str  = "11111111010011111111111010000001"
str2 = "11000000000000000000000000000011"

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

str & str2 #=> "11000000000000000000000000000001"

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

str.to_i #=> 11111111010011111111111010000001

我该如何解决这个问题?

【问题讨论】:

标签: ruby bitwise-and


【解决方案1】:

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

str  = "11111111010011111111111010000001"
str2 = "11000000000000000000000000000011"

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

result.to_s(2)
=> "11000000000000000000000000000001"

【讨论】:

    【解决方案2】:

    您可以使用to_i 从二进制表示法转换,并通过指定基数作为参数使用to_s 转换回二进制表示法。 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"
    

    【讨论】:

      【解决方案3】:

      不与整数相互转换:

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

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

      $~ 返回匹配项,begin 返回其索引。

      【讨论】:

        猜你喜欢
        • 2021-07-23
        • 2014-05-03
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多