2013-03-05 6 views
0

Я хотел бы изменить значение значения значения UISlider в его двоичную форму.Значение ползунка, int для двоичного преобразования

Что касается того, что я сделал:

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

Что вы подразумеваете под словом «он не преобразован в двоичный»? Какую продукцию вы получаете и чего вы ожидаете? – 2013-03-05 14:28:19

+0

Когда я увеличиваю или уменьшаю значение ползунка (значение), так как я хочу, чтобы это значение менялось каждый раз на двоичный. Если вы проверили мою программу, я изменил значение ползунка от float до int, например, я хочу преобразовать в двоичный – Dian007

+0

О, я просто должен был прочитать код ... – 2013-03-05 14:39:04

ответ

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 объекта.

+0

thx чувак его работы отлично – Dian007

+0

@ Dian007 Добро пожаловать. – Metabble

0

Это:

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

Вы не создаете экземпляр NSMutableArray, вы просто объявить указатель на него. Alloc-init, и все будет хорошо.

+0

На самом деле, хотя OP явно копировал и вставлял фрагмент кода двоичного преобразования Адама Розенфилда, они перепутали несколько вещей. Во-первых, «NSInteger» не является 8 битами, поэтому исходная версия не использовала индекс, но проверялась, чтобы убедиться, что бит-сдвинутое значение все еще было выше нуля. Кроме того, они пытаются зарегистрировать значение 'NSInteger', поскольку они будут' NSNumber', когда они, вероятно, должны использовать '% d'. – Metabble

+0

@ h2co3, я попробовал, что тоже его не работает :( – Dian007

Смежные вопросы