【问题标题】:NSString Binary manipulationNSString 二进制操作
【发布时间】:2014-04-30 09:56:25
【问题描述】:

我有NSString *a =@"00011"NSString *b=@"110001",我想用这些字符串按位与(&),即"a" & " b" ,值应该是00001
如何做到这一点,我可以进行手动操作,例如循环字符串,但我想使用 & 运算符。如何实现?

【问题讨论】:

  • 为作业使用正确的数据类型。字符串不是正确的数据类型。
  • 您不能将位运算符与 NSString 一起使用。
  • @trojanfoe 当不应限制位数时,通常将数字存储为字符串。

标签: ios objective-c


【解决方案1】:

巧合的是,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];
}

【讨论】:

    【解决方案2】:

    测试代码: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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2011-10-01
      • 2012-06-04
      • 2021-07-25
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多