class BitCollection
def initialize(collection)
@collection = collection
end
def labels(value)
[].tap do |list|
@collection.each_pair do |pos, label|
list << label if (1 << (pos - 1)) & value > 0
end
end
end
def value(*labels)
sum = 0
labels.each do |label|
pos = @collection.key(label)
sum += 1 << (pos - 1)
end
sum
end
end
properties = {
1 => '公告',
2 => '轮播',
3 => '置顶',
4 => '推广'
}
parser = BitCollection.new(properties)
parser.value('置顶', '推广') # => 12
parser.labels(12) # => ["置顶", "推广"]
Ruby 分享:借助位运算实现多个属性的存储与读取
2021-10-20