我有NSString *a =@"00011"
和NSString *b=@"110001"
,我想使用这些字符串按位AND(&),这是" a&#34 ; & " b" ,值应为00001
。
如何实现这一点,我可以像循环弦乐一样进行手动操作,但我想使用&运营商。如何实现?
答案 0 :(得分:4)
巧合的是,ASCII编码的“0”和“1”字符的二进制表示使得只能按字符和字符本身执行:
'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];
}
答案 1 :(得分: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;
}