1

给定以下代码,我将如何对 2 个位图执行按位 And 并取回生成的位图?

    CFBitVectorRef maskForCollection = CFBitVectorCreate(nil, 0, _tables.AllObjects.count);

    for ( LocalFilter * filter in self)
    {
        CFBitVectorRef maskForFilter = filter.ValidObjectMask;

        CFBitVectorRef blah = maskForCollection & maskForFilter;
    }

这篇文章是相关的:如何按位和 CFBitVector,但它根本没有帮助......

4

1 回答 1

2

以下函数创建CFBitVectorRef两个位图的按位与。该函数假定两个位图具有相同的大小count(在您的情况下是正确的,正如您在评论中所说)。

该函数创建第一个位图的(可变)副本,然后清除第二个位图中为零的所有位。

CFBitVectorRef CreateBitmapAnd(CFBitVectorRef bm1, CFBitVectorRef bm2, CFIndex count)
{
    CFMutableBitVectorRef result = CFBitVectorCreateMutableCopy(NULL, count, bm1);
    for (CFIndex i = 0; i < count; i++) {
        if (CFBitVectorGetBitAtIndex(bm2, i) == 0)
            CFBitVectorSetBitAtIndex(result, i, 0);
    }
    return result;
}

如何按位和 CFBitVector的建议解决方案相比,此函数不使用位图的内部表示。

不同的实现如下:

CFBitVectorRef CreateBitmapAnd(CFBitVectorRef bm1, CFBitVectorRef bm2, CFIndex count)
{
    size_t nbytes = (count + 7)/8;
    UInt8 *bytes1 = malloc(nbytes); // (Error checking omitted)
    UInt8 *bytes2 = malloc(nbytes);
    CFBitVectorGetBits(bm1, CFRangeMake(0, count), bytes1);
    CFBitVectorGetBits(bm2, CFRangeMake(0, count), bytes2);
    for (size_t i = 0; i < nbytes; i++) {
        bytes1[i] &= bytes2[i];
    }
    CFBitVectorRef result = CFBitVectorCreate(NULL, bytes1, count);
    free(bytes1);
    free(bytes2);
    return result;
}

优点是它对字节而不是位进行操作(并且可以进一步优化以对整数进行操作),缺点是需要分配和释放内存。

于 2013-01-26T20:34:54.847 回答