【问题标题】:How do I compare two bit vectors for equivalence?如何比较两个位向量的等价性?
【发布时间】:2014-04-24 00:27:23
【问题描述】:

比较两个位向量的最有效方法是什么?在 Objective-C 中,我使用 CFBitVectors 并简单地比较两者中的每一位:

for (CFIndex bitIndex = 0; bitIndex < numBits; bitIndex++) {
    if (CFBitVectorGetBitAtIndex(thisVector, bitIndex) != CFBitVectorGetBitAtIndex(thatVector, bitIndex)) {
        return NO;
    }
}
return YES;

这很好用,但我不确定是否有更有效的方法来使用位运算符。

【问题讨论】:

  • 根据你有多少位,为什么不调用CFBitVectorGetBits并将它们转储到一个零无符号intlong,然后比较是否相等?
  • 请去掉“C”标签。这与 C 无关。
  • @r-d 代码是 C,我希望答案也是。所以,被你的评论弄糊涂了。
  • @r-d 划掉我之前的评论。我忘记了向量对象是不透明的,无法直接访问底层位数组。所以,是的,在这种情况下不是那么 C-ish。
  • @PaulGriffiths 我可以有相当大的位向量,但我想我可以将它们分成 32 位或 64 位部分并比较整数值。不过,不确定这是否会更有效,而且我希望代码不会那么清晰。

标签: objective-c bit-manipulation equivalent bitvector


【解决方案1】:

可以对两个 CFBitVectorRef 结构进行按位或运算,如this answer 中所述。但是,这在未来可能会失败,因为它依赖于实现。如 OP 中所述,比较它们的最安全方法似乎是一次一位。这是一个可以完成所有工作的实用函数:

BOOL CFBitVectorEqualsCFBitVector(CFBitVectorRef thisVector,  CFBitVectorRef thatVector) {
    CFIndex numBits = CFBitVectorGetCount(thisVector);
    if (numBits != CFBitVectorGetCount(thisVector)) return NO;
    for (CFIndex bitIndex = 0; bitIndex < numBits; bitIndex++) {
        if (CFBitVectorGetBitAtIndex(thisVector, bitIndex) != CFBitVectorGetBitAtIndex(thatVector, bitIndex)) {
            return NO;
        }
    }
    return YES;
}

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 2021-05-23
    • 2013-06-07
    • 2011-09-09
    • 1970-01-01
    • 2010-12-25
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多