Ruby 中的位掩码:获取生成位掩码的数字
Bitmasking in Ruby: Get numbers which generated the bitmask
目前我将一组项目的组合存储为单个整数(位掩码值),如下例所示:
示例:
1 - Orange
2 - Banana
4 - Cherry
8 - Apple
然后如果用户选择 Orange (1) 和 Apple (8) 那么它们的总和就是 9。
并且始终且仅当这两项合并时,此值才为 9。
并且您能够恢复用于生成此号码的原始两个号码。
这是一个可以解决问题的示例网站:
http://www.tfxsoft.com/playground/calc.php
我需要的:
我需要一个算法(最好在 Ruby 中),它会取这两个位掩码值的总和 (9) 和 return 它 "contains" 的值( 1 和 4 ).
据我了解,您想查找位的位置。这是简单但不是最优的解决方案:
2.1.5 :033 > 9.to_s(2).reverse.chars.map.with_index { |b, i| b == "1" ? i + 1 : nil }.compact
=> [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"}
目前我将一组项目的组合存储为单个整数(位掩码值),如下例所示:
示例:
1 - Orange
2 - Banana
4 - Cherry
8 - Apple
然后如果用户选择 Orange (1) 和 Apple (8) 那么它们的总和就是 9。
并且始终且仅当这两项合并时,此值才为 9。
并且您能够恢复用于生成此号码的原始两个号码。
这是一个可以解决问题的示例网站: http://www.tfxsoft.com/playground/calc.php
我需要的:
我需要一个算法(最好在 Ruby 中),它会取这两个位掩码值的总和 (9) 和 return 它 "contains" 的值( 1 和 4 ).
据我了解,您想查找位的位置。这是简单但不是最优的解决方案:
2.1.5 :033 > 9.to_s(2).reverse.chars.map.with_index { |b, i| b == "1" ? i + 1 : nil }.compact
=> [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"}