NSString二进制操作

时间:2014-04-30 09:56:26

标签: ios objective-c

我有NSString *a =@"00011"NSString *b=@"110001",我想使用这些字符串按位AND(&),这是" a&#34 ; & " b" ,值应为00001
如何实现这一点,我可以像循环弦乐一样进行手动操作,但我想使用&运营商。如何实现?

2 个答案:

答案 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;
}
相关问题