滑块值,int到二进制转换

时间:2013-03-05 14:23:48

标签: objective-c cocoa-touch

我想将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);

}

但是,有一个问题。每当滑块值改变时,它就会转换为整数和十六进制,但不会转换为二进制。任何人都可以帮我找到我犯错的地方吗?

2 个答案:

答案 0 :(得分: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而不是NSInteger之后,long的正确说明符为%@%@记录对象的description方法返回的字符串。

答案 1 :(得分:0)

此:

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

您不创建NSMutableArray的实例,只需声明指向它的指针即可。 Alloc-init它,它会没事的。