2014-04-30 80 views
2

我有NSString *a [email protected]"00011"NSString *[email protected]"110001",我想要做的按位和使用這些字符串(&),也就是說「一」 & 「B」,值應爲00001
如何實現這一點,我可以像循環的字符串做手動操作,但我想使用&運算符。如何實現這一目標?NSString的二進制操作

+5

對作業使用正確的數據類型。字符串不是正確的數據類型。 – trojanfoe

+0

您不能在NSString中使用按位運算符。 – Shai

+0

請選擇這個:http://stackoverflow.com/a/7207304/905514 –

回答

1

測試的代碼:d

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    int a = [self binaryStringToInt:@"100011"]; 
    int b = [self binaryStringToInt:@"110001" ]; 
    int result = a & b; 
    NSString *resultBinary = [self binaryStringFromNum:result]; 
    NSLog(@"%@", resultBinary); 
} 


-(int)binaryStringToInt:(NSString *)str { 
    const char* utf8String = [str UTF8String]; 
    char* endPtr = NULL; 
    int num = strtol(utf8String, &endPtr, 2); 
    return num; 
} 

- (NSString *)binaryStringFromNum:(uint64_t)num { 
    NSMutableString *str = [[NSMutableString alloc] init]; 
    for(uint64_t numberCopy = num; numberCopy > 0; numberCopy >>= 1) 
    { 
    [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0]; 
    } 
    return str; 
} 
4

由於巧合編碼「0」和「1」字符的ASCII的二進制表示使得有可能只執行按位與在字符本身:

'0' & '0' == '0' 
'0' & '1' == '0' 
'1' & '0' == '0' 
'1' & '1' == '1' 

這個事實可以輕鬆地執行按位和任意長度的字符串(超過64位數字)。以下實現使用了也適用的UTF16字符。它僅受堆棧大小的限制(由於VLA)。

NSString *StringBinaryAnd(NSString *a, NSString *b) 
{ 
    NSUInteger length = [a length]; 
    NSCParameterAssert([b length] == length); 

    unichar buffer[length]; 
    [a getCharacters:buffer range:(NSRange){.length=length}]; 

    for (NSUInteger i = 0; i < length; i += 1) 
     buffer[i] &= [b characterAtIndex:i]; // here's the magic 

    return [[NSString alloc] initWithCharacters:buffer length:length]; 
}