2009-12-17 6 views
4

Jarret Hardie poster hier code pour convertir un NSinteget en binaire, et fonctionne parfaitement, mais j'ai besoin au format 8bit:NSInteger à valeur binaire (chaîne) en format 8bit

4 -> 00000100

des idées pour modifier ce code?

// Original author Adam Rosenfield... SO Question 655792 
NSInteger theNumber = 56; 
NSMutableString *str = [NSMutableString string]; 
for(NSInteger numberCopy = theNumber; numberCopy > 0; numberCopy >>= 1) 
{ 
    // Prepend "0" or "1", depending on the bit 
    [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0]; 
} 

NSLog(@"Binary version: %@", str); 

Merci !!!!!!

Répondre

11

Cela devrait fonctionner:

NSInteger theNumber = 56; 
NSMutableString *str = [NSMutableString string]; 
NSInteger numberCopy = theNumber; // so you won't change your original value 
for(NSInteger i = 0; i < 8 ; i++) { 
    // Prepend "0" or "1", depending on the bit 
    [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0]; 
    numberCopy >>= 1; 
} 

NSLog(@"Binary version: %@", str); 
+0

solution idéale pour les valeurs de masque de bit d'enregistrement –

3

En ce qui concerne, et à l'appui de la réponse de @vincent Osinga .. Voici ce code, enveloppé dans une fonction C .. qui retourne la « chaîne » binaire à partir d'un NSUInteger .. parfait pour de l'exploitation forestière au niveau du bit de typedef, etc.

- (NSString*) bitString:(NSUInteger) mask{ 
    NSString *str = @""; 
    for (NSUInteger i = 0; i < 8 ; i++) { 
     // Prepend "0" or "1", depending on the bit 
     str = [NSString stringWithFormat:@"%@%@", 
         mask & 1 ? @"1" : @"0", str]; 
     mask >>= 1; 
    } 
    return str; 
} 

Je ne pense NSInteger numberCopy = theNumber; est nécessaire que vous n'êtes pas l'aide d'un pointeur, mais simplement la valeur primitive comme argument, // so you won't change your original value. Cela permettra une utilisation comme/résultats de rendement comme ...

NSEventType anEvent = NSLeftMouseUp|NSLeftMouseDown; 
NSLog(@"%@, %u\n%@, %u\n%@, %u\n%@, %u", 
    bitString(NSScrollWheel), NSScrollWheel, 
    bitString(NSLeftMouseUp|NSLeftMouseDown), 
       NSLeftMouseUp|NSLeftMouseDown, 
    bitString(anEvent), anEvent, 
    bitString(NSAnyEventMask), NSAnyEventMask); 

NSLog ➞

00010110, 22 /* NSScrollWheel */ 
00000011, 3 /* NSLeftMouseUp | NSLeftMouseDown */ 
00000011, 3 /* same results with typedef'ed variable */ 
11111111, 4294967295 /* NSAnyEventMask */ 
5

Si quelqu'un est intéressé, voici ma version:

Snippet:

NSString *NSStringWithBits(int64_t mask) { 
    NSMutableString *mutableStringWithBits = [NSMutableString new]; 
    for (int8_t bitIndex = 0; bitIndex < sizeof(mask) * 8; bitIndex++) { 
     [mutableStringWithBits insertString:mask & 1 ? @"1" : @"0" atIndex:0]; 
     mask >>= 1; 
    } 
    return [mutableStringWithBits copy]; 
} 
+1

Je suppose que ce doit être 'sizeof (masque) * 8' au lieu de' sizeof (masque) 'depuis sizeof() retourne octets et vous voulez des bits;) – Raphael

+0

@RaphaelWichmann Correction, merci. –

Questions connexes