2009-03-17 3 views
13

Sto cercando di capire come convertire un NSInteger, diciamo 56, in un NSString che è una rappresentazione binaria del valore originale (int). Forse qualcuno conosce una tecnica di formattazione che può accettare 56 e restituire "111000" in Objective C. Grazie a tutti.Come convertire NSInteger in un valore binario (stringa)

risposta

26

Non esiste un operatore di formattazione incorporato per farlo. Se si voleva convertirlo in una stringa esadecimale, si potrebbe fare:

NSString *str = [NSString stringWithFormat:@"%x", theNumber]; 

Per convertirlo in una stringa binaria, si dovrà costruire da soli:

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

si ottiene uno di questi errori gialli se non fai 'NSMutableString * str = [NSMutableString stringWithFormat : @ ""]; ' –

4

Approssimativamente:

-(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

Cosa succede se l'input è zero? – epatel

+0

Questo fallisce se l'input è 0 (o, in effetti, se l'ultimo bit è 0), e alloca e rilascia anche N oggetti stringa, dove N è il numero di bit nel numero. Non molto efficiente. –

+0

Quindi circa. Ma buona cattura. –

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

ho iniziato dalla versione di Adam Rosenfield, e modificato a:

  • aggiungere gli spazi tra i byte
  • maniglia firmato interi

Esempio di output:

-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