将NSInteger转换为8位二进制格式的字符串值

5
昨天Jarret Hardie(谢谢!)发布了这段代码,用于将NSinteget转换为二进制,它可以完美地工作,但我需要8位格式的:

4 -> 00000100

有什么想法修改这个代码吗?

// 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);

感谢!!!!!
3个回答

12

这应该可以正常工作:

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

记录位掩码值的绝佳解决方案 - Patrick Goley

5
如果有人感兴趣,这是我的版本,它可以自动检测位数并遵守Coding Guidelines for Cocoa
片段:
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
我猜应该是 sizeof(mask) * 8 而不是 sizeof(mask),因为 sizeof() 返回的是字节而你需要的是位数 ;) - Raphael

3

参考@vincent osinga的回答并支持他的观点,这里是一个包装在C函数中的代码,可以从NSUInteger返回二进制“字符串”,非常适合记录位定义等。

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

我认为你不需要使用NSInteger numberCopy = theNumber;,因为你没有使用指针,而仅仅是将原始值作为参数,// 所以你不会改变原来的值。这样做可以使其使用/产生如下结果...

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 */

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