Ruby中的位掩模:获取生成位掩码的数字



目前,我将一组项目的组合作为一个整数(位式值),如下示例:

示例:

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

然后,如果用户选择 Orange 1 )和 Apple 8 )这些是 9

始终而且只有当这两个项目合并时,此值是 9

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

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

我需要的:

我需要一个算法(优先在Ruby中),该算法将占用这两个位掩码值的总和(9),然后返回其"包含"的值(1和4)。

我认为这可能是您想要的:

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.1.5 :033 > 9.to_s(2).reverse.chars.map.with_index { |b, i| b == "1" ? i + 1 : nil }.compact
 => [1, 4]

最新更新