2009-03-17 5 views
13

Я пытаюсь понять, как преобразовать NSInteger, скажем 56, в NSString, который представляет собой двоичное представление исходного (int) значения. Возможно, кто-то знает метод форматирования, который может принять 56 и вернуть «111000» в Objective C. Спасибо всем.Как преобразовать NSInteger в двоичное (строковое) значение

ответ

26

Для этого нет встроенного оператора форматирования. Если вы хотите, чтобы преобразовать его в шестнадцатеричную строку, вы можете сделать:

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 * ул = [NSMutableString stringWithFormat : @ ""]; ' –

4

Грубо:

-(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]; 
    } 
} 
+1

Что делать, если вход равен нулю? – epatel

+0

Это не удается, если вход равен 0 (или фактически, если последний бит равен 0), а также выделяет и освобождает N строковых объектов, где N - количество бит в числе. Не очень эффективно. –

+0

Отсюда примерно. Но хороший улов. –

20
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; 
} 

Я начал с версии Адама Розенфельд, и модифицирован для:

  • добавить пробелы между байтами
  • ручка подписали целые

Пример вывода:

-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 
Смежные вопросы