使用二进制模式作为选择器选择数组元素



我有一个NSArray,并且我已经计算了一个整数列表,这些整数表示(以二进制表示)我需要从数组中取出到新数组中的元素。

例如,我有7、11和13,它们的位模式是000111001011001101。我想获取三个数组,由元素0、1、2组成,然后是元素0、1、3,然后是主数组中的元素0、2、3。

从您拥有的位模式构建NSIndexSet:

@implementation NSIndexSet (NonContiguous)
+ (instancetype)indexSetFromMask:(NSUInteger)mask
{
    NSMutableIndexSet * set = [NSMutableIndexSet indexSet];
    for( NSUInteger i = 0; i < (sizeof(NSUInteger) * 8); i++ ){
        if( mask & (1l << i) ){
            [set addIndex:i];
        }
    }
    return set;
}
@end

然后使用objectsAtIndexes:

[origArray objectsAtIndexes:[NSIndexSet indexSetFromMask:7]];
// etc.

假设您希望输出的格式为[[a,b,c],[a,b,d],[a,c,d]],例如,您可以这样做:

NSArray *sourceArray = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",@"d",...,nil];
NSArray *grabArray = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:7],[NSNumber numberWithInt:11],[NSNumber numberWithInt:13],...,nil];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];

然后为grabArray的每个元素添加正确的元素到resultArray:

for (NSNumber num in grabArray) {
    int n = [num intValue];
    int bit = floor(log2(n)); //get highest bit in the current number
    NSMutableArray *curr = [[NSMutableArray alloc] init];
    while (n>0) {
        if (n>pow(bit,2)) { //if this bit is a 1
            [curr addObject:[sourceArray objectAtIndex:bit]];
        }
        n-=pow(bit,2);
        bit-=1;
    }
    [resultArray addObject:curr];
}

那么resultArray应该是你正在寻找的数组。它将以相反的顺序添加对象,所以如果顺序很重要,您将希望使用[curr insertObject: [sourceArray objectAtIndex:bit] atIndex:0];

最新更新