以下函数创建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;
}
优点是它对字节而不是位进行操作(并且可以进一步优化以对整数进行操作),缺点是需要分配和释放内存。