我想知道是否有办法使用按位运算符屏蔽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);
}
提前致谢。我真的很感谢你的帮助和时间。
(对不起我的英文)
答案 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.Bloomfilters或bloom
答案 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");
}