如何使用按位运算符屏蔽整数

时间:2012-05-03 23:45:39

标签: bit-manipulation bitwise-operators bitmask bloom-filter

我想知道是否有办法使用按位运算符屏蔽int值列表,并使用该掩码知道int值是否是掩码中的值之一。

即。如果我有值129和17,如何计算一个掩码,告诉我掩码中的int值是否对应(如果int值是129或17)。

我希望我的问题能够更好地理解下一个伪代码。

*的 *编辑: 我想只在一个值(掩码)中打包,掩码或“压缩”一个int数组,然后只接受值列表中的值来掩盖(数组)。

有可能吗?提前谢谢。

valuesToMask = [17, 129, ...]
mask = getmask(valuesToMask)
lstValues = [0,1, 10, ..., 17, 18, 19, ..., 129, ...]
foreach(int value, in lstValues) {
    if(check(mask,value)) 
       printf("\nValue %d is in the mask", value);
    else 
       printf("\nValue %d is not in the mask", value);
}

提前致谢。我真的很感谢你的帮助和时间。

(对不起我的英文)

3 个答案:

答案 0 :(得分:2)

您可以为某些值集合执行此操作,但不一定是这样。例如,如果要确定值是4,5,6还是7,则可以执行以下操作:

if ((value & ~3) == 4) ...

这将创建一个掩码,除最不重要的两位外,所有位都为1。 &运算符有效地将最低有效两位设置为0.然后比较检查比特模式是否与您要查找的值匹配。在二进制表示中,这看起来如下(假设value是一个8位值):

value        masked
00000011     00000000 = 0
00000100     00000100 = 4
00000101     00000100 = 4
00000110     00000100 = 4
00000111     00000100 = 4
00001000     00001000 = 8

如果您想检查“4,5或7”,此技术将无效。

答案 1 :(得分:2)

您可以部分使用Bloom Filters解决您的问题。这种方法的工作方式是,为了测试N - 项集合中的成员资格,您可以定义K哈希函数以将每个项目映射到M位密钥。要插入元素a,请将位置h1(a) ... hk(a)处的过滤器位设置为1.对于元素b的查找,如果检测到零位于h1(b) ... hk(b)的任意位,保证b不在集合中。根据N,M和K的值,您获得误报的可能性很小(即您从散列函数中检测不到零,但先前未将b存储在过滤器中。)< / p>

在伪代码中:

const int M = 256;
typedef std::bitset<M> Mask;

int listValues[N] = { v1, ... , vN };
typedef unsigned char (*)(int) HashFunction; // maps int to 0...255
HashFunction hash[K] = { h1, ..., hK };

Mask make_mask(int x)
{
    Mask m(0):
    for (int i = 0; i < K; ++i) { 
        m[(hash[i])(x)] = 1; // update mask with item's hash
    }
    return(m);
}    

// initialize
Mask BloomFilter(0);
for (int i = 0; i < N; ++i) {        
    BloomFilter |= make_mask(listValues[i]);
}

// probe
bool is_not_in_filter(const Mask& F, int x)
{
    // if a zero-bit in F matches a 1-bit in make_mask(x), then x is not in F
    return ~F & make_mask(x) != 0; 
}

// call
int x = ...;
bool in_set = is_not_in_filter(BloomFilter, x);

实际上,这会将每个项目扩展为M位密钥,并且过滤器是所有项目的按位OR比例。然后,对于集合成员资格的测试变为NEGATED过滤器与要测试的M位扩展项之间的简单(尽管是概率性的)按位AND。

<强>更新 上面的代码是伪代码,用于解释它是如何工作的。要获得实际的库,请参阅例如实验Boost.Bloomfiltersbloom

答案 2 :(得分:-1)

我想你问你怎么检查数字是129还是17。

int[] lstValues = [0,1, 10, 17, 18, 19, 129];
foreach(int value in lstValues) {
    if(lstValues == 129 || lstValues == 17) 
        printf("\nValue is in the mask");
    else 
        printf("\nValue is not in the mask");
}