如何将NSInteger转换为二进制(字符串)值

14

我正在尝试找出如何将一个NSInteger转换为NSString,例如56,以二进制表示原始(int)值。也许有人知道一种可以接受56并返回"111000"的格式技术,在Objective C中实现。谢谢大家。

我想了解如何将一个整型数(比如56)转化为它的二进制字符串表示,能否提供一种在Objective-C中可以实现这个功能的格式化技术?感谢各位!
3个回答

27

没有内置的格式化运算符可以实现这样的功能。如果你想将其转换为十六进制字符串,可以这样做:

NSString *str = [NSString stringWithFormat:@"%x", theNumber];
要将其转换为二进制字符串,您需要自己构建它:
NSMutableString *str = [NSMutableString stringWithFormat:@""];
for(NSInteger numberCopy = theNumber; numberCopy > 0; numberCopy >>= 1)
{
    // Prepend "0" or "1", depending on the bit
    [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
}

1
如果你不执行 NSMutableString *str = [NSMutableString stringWithFormat:@""];,你会得到其中一个黄色错误。 - Eliza Wilson

21
NSString * binaryStringFromInteger( int number )
{
    NSMutableString * string = [[NSMutableString alloc] init];

    int spacing = pow( 2, 3 );
    int width = ( sizeof( number ) ) * spacing;
    int binaryDigit = 0;
    int integer = number;

    while( binaryDigit < width )
    {
        binaryDigit++;

        [string insertString:( (integer & 1) ? @"1" : @"0" )atIndex:0];

        if( binaryDigit % spacing == 0 && binaryDigit != width )
        {
            [string insertString:@" " atIndex:0];
        }

        integer = integer >> 1;
    }

    return string;
}

我从Adam Rosenfield的版本开始,进行了修改:

  • 在字节之间添加空格
  • 处理有符号整数

样例输出:

-7            11111111 11111111 11111111 11111001
7             00000000 00000000 00000000 00000111
-1            11111111 11111111 11111111 11111111
2147483647    01111111 11111111 11111111 11111111
-2147483648   10000000 00000000 00000000 00000000
0             00000000 00000000 00000000 00000000
2             00000000 00000000 00000000 00000010
-2            11111111 11111111 11111111 11111110

4

Roughly:

-(void)someFunction
{
  NSLog([self toBinary:input]);
}

-(NSString *)toBinary:(NSInteger)input
{
  if (input == 1 || input == 0) {
    return [NSString stringWithFormat:@"%d", input];
  }
  else {
    return [NSString stringWithFormat:@"%@%d", [self toBinary:input / 2], input % 2];
  }
}

如果输入为0(或者实际上最后一位是0),则此方法会失败,并且它还会分配和释放N个字符串对象,其中N是数字中的位数。效率不高。 - Adam Rosenfield
NSMutableString继承自NSString,因此insertString可能与此相同。 - Benjamin Autin
除了它并没有。insertString:atIndex:将插入到相同的缓冲区(如果需要,会扩展缓冲区),而stringWithFormat则分配一个新的自动释放的NSString对象。 - Adam Rosenfield
无论哪种方式,这都是一小段可丢弃的代码。使用NSMutableString与获取新NSString所带来的影响可以忽略不计。更不用说我用了递归,这也会占用栈空间。最好的评价就是它很实用(以编程风格而言)。 - Benjamin Autin
感谢大家的建议和评论。 - Richard Tilt
超棒的功能。佩服。 - Manan Devani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接