【问题标题】:Bitmasking in Ruby: Get numbers which generated the bitmaskRuby 中的位掩码:获取生成位掩码的数字
【发布时间】:2015-05-05 17:12:56
【问题描述】:

目前我将一组项目的组合存储为单个整数(位掩码值),如下例所示:

示例:

1 - Orange 
2 - Banana
4 - Cherry 
8 - Apple

然后如果用户选择Orange1)和Apple8),那么总和那些是9

而且只有当这两个项目结合时,这个值才是9

并且您可以恢复用于生成此数字的原始两个数字。

这是一个可以解决问题的示例网站: http://www.tfxsoft.com/playground/calc.php

我需要什么:

我需要一个算法(最好在 Ruby 中),它会取这两个位掩码值的总和 (9) 并返回它“包含”的值(1 和 4)。

【问题讨论】:

  • Annnndddd 到目前为止你尝试过什么?
  • 这已经被问了数百次了,我承认通常不是在 Ruby 中,但它不会有根本的不同..

标签: ruby algorithm bitmask


【解决方案1】:

我认为这可能是您正在寻找的:

FRUIT = { 1 => 'Orange', 2 => 'Banana', 4 => 'Cherry', 8 => 'Apple' }

def mask_fruit(a, b) a | b end
def unmask_fruit(masked)
  FRUIT.select { |k, _| (masked | k) == masked } 
end

mask = mask_fruit 1, 8 # => 9
unmask_fruit mask # => {1=>"Orange", 8=>"Apple"}

【讨论】:

    【解决方案2】:

    据我了解,您想找到位的位置。这是简单但不是最佳的解决方案:

    2.1.5 :033 > 9.to_s(2).reverse.chars.map.with_index { |b, i| b == "1" ? i + 1 : nil }.compact
     => [1, 4]
    

    【讨论】:

    • 我想你的意思是写:9.to_s(2).reverse.chars.map.with_index { |b, i| b == '1' ? 2 ** i : nil }.compact # => [1, 8]
    猜你喜欢
    • 2020-01-28
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2015-01-20
    相关资源
    最近更新 更多