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

}

ただし、問題があります。スライダーの値が変更されるたびに、整数と16進数に変換されますが、2進数には変換されません。誰かが私が間違いを犯した場所を見つけるのを手伝ってくれますか?

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、にキャストした後NSIntegerです。オブジェクトのメソッドによって返された文字列をログに記録します。long%@%@description

于 2013-03-05T14:59:15.963 に答える
0

これ:

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

NSMutableArray のインスタンスを作成するのではなく、それへのポインターを宣言するだけです。Alloc-init を実行すれば問題ありません。

于 2013-03-05T14:39:47.417 に答える