java中的BitMask操作

时间:2010-03-01 00:16:02

标签: java bitmask

考虑一下情景 我有像这样分配的值

  

亚马逊-1

     

沃尔玛-2

     

目标-4

     

Costco -8

     

Bjs -16

在数据库中,通过根据每种产品的可用性屏蔽这些值来存储数据。 例如,

  

面具产品说明

     

1台笔记本电脑在亚马逊上市

     

亚马逊提供17款iPhone   和BJ

     

24床垫可用   Costco和BJ的

像这些产品一样,所有产品都被屏蔽并存储在数据库中。

如何根据Masked值检索所有零售商。 例如,对于床垫,蒙面值为24.然后我如何找到或列出Costco& BJ以编程方式。任何算法/逻辑都将受到高度赞赏。

4 个答案:

答案 0 :(得分:9)

int mattress = 24;
int mask = 1;
for(int i = 0; i < num_stores; ++i) {
    if(mask & mattress != 0) {
        System.out.println("Store "+i+" has mattresses!");
    }
    mask = mask << 1;
}

if语句将这些位排成一行,如果床垫值与掩码组具有相同的位,那么该商店的面具会销售床垫。当商店出售床垫时,床垫值和面罩值的AND将仅为非零。对于每次迭代,我们将掩码位向左移动一个位置。

请注意,掩码值应为正值,而不是负值,如果需要,可以乘以负值。

答案 1 :(得分:1)

假设您的意思是在SQL数据库中,那么在您的检索SQL中,您通常可以添加例如WHERE(MyField AND 16)= 16,WHERE(MyField AND 24)= 24等。

但是,请注意,如果您尝试优化此类检索,并且通常与查询匹配的行数远小于总行数,那么这可能不是表示此数据的好方法。在这种情况下,最好有一个单独的“ProductStore”表,其中包含表示此信息的(ProductID,StoreID)对(并在StoreID上编制索引)。

答案 2 :(得分:1)

在每种情况下,最多有两家零售商的库存总和为“蒙面”价值吗?如果是这样,您仍然需要检查所有对以检索它们,这将花费n²时间。只需使用嵌套循环。

如果该值代表任意数量零售商库存的总和,那么您正试图解决subset-sum问题,所以不幸的是,您不能在2 ^ n时间内完成。

如果您能够使用信息来扩充原始数据结构,以查找对总和有贡献的零售商,那么这将是理想的选择。但是,由于您提出的问题我假设您在构建数据结构时无法访问数据结构,因此要生成所有零售商子集以进行检查,您需要查看Knuth's algorithm [pdf]在TAOCP Vol 4a Sec 7.2.1.3中给出所有k组合(并运行1 ... k)。

答案 3 :(得分:0)

http://www.antiifcampaign.com/

记住这一点。如果你可以用另一个构造(地图/策略模式)删除“if”,对我来说你可以把它放在那里,否则“if”真的很危险!! (F.Cirillo)

在这种情况下,您可以使用带有位掩码操作的map映射。

卢卡。