我想将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);
}
但是,有一个问题。每当滑块值改变时,它就会转换为整数和十六进制,但不会转换为二进制。任何人都可以帮我找到我犯错的地方吗?
答案 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它,它会没事的。