0

我想将 UISlider 值的 value 属性更改为其二进制形式。

至于我做了什么:

-(IBAction)setValue:(id)sender
{

    int value =(int)([sliderValue value] *200);


    NSLog(@"slider value int %i", value);

    NSLog(@"hex 0x%02X",(unsigned int)value);

    NSMutableArray *xx;
    [xx addObject:[NSNumber numberWithInt:value]];

    NSLog(@"%@",xx);

    NSInteger theNumber = [[xx objectAtIndex:value]intValue];
    NSLog(@"%@",theNumber);
    NSMutableString *str = [NSMutableString string];
    NSInteger numberCopy = theNumber; // so won't change 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);

}

但是,有一个问题。每当滑块值更改时,它都会转换为整数和十六进制,但不会转换为二进制。谁能帮我找出我犯错的地方?

4

2 回答 2

2
- (IBAction)setValue:(id)sender
{
    NSInteger value = (NSInteger)([sliderValue value] * 200.0);

    NSMutableString *binaryString = [[NSMutableString alloc] init];
    for(NSInteger numberCopy = value; numberCopy > 0; numberCopy >>= 1)
    {
        // Prepend "0" or "1", depending on the bit
        [binaryString insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
    }

    NSLog(@"%@", binaryString);
}

这应该记录值的二进制表示。除了您的数组缺少初始化程序(为简洁起见,我已经完全删除)之外,您的原始文件存在缺陷,因为您使用了从 0 到 8 的索引,这意味着它只会记录值的前 8 位。NSInteger是 32 位或 64 位,这就是为什么您从 Stack Overflow 中提取的原始代码改为检查我们进行位移的值是否已达到零的原因。此外,正确的说明符NSInteger%ld在将 a 转换NSInteger为 a之后long,而不是%@。记录对象方法%@返回的字符串。description

于 2013-03-05T14:59:15.963 回答
0

这:

NSMutableArray *xx;
[xx addObject:[NSNumber numberWithInt:value]];

你不需要创建 NSMutableArray 的实例,你只需声明一个指向它的指针。分配初始化它,它会没事的。

于 2013-03-05T14:39:47.417 回答