Завален бинарными битовыми преобразованиями - PullRequest
0 голосов
/ 24 марта 2011

Я нашел и изменил преобразователь int-to-bin, который, кажется, работает правильно.Затем я собрал преобразователь bin-to-int, но результат показывает, что я читаю двоичный файл в обратном направлении.Я изменил направление цикла for: for (i = 11; i> = 0; i--), но получил тот же результат.

@implementation MainViewController

- (void)intToBin:(int)theNumber
{
    NSMutableString *str = [NSMutableString string];
    NSInteger numberCopy = theNumber;
    for(NSInteger i = 0; i <= 11 ; i++)
    {
        [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];
         numberCopy >>= 1;
    }
    NSLog(@"Binary version: %@", str);
}

- (void)binToInt:(NSString *)theBinary
{
    int decNumber = 0;
    int i; 
    for(i = 0; i <=11; i++)   // then tried: for(i = 11; i >=0; i--)
    {
        NSString *digitChar = [theBinary substringWithRange: NSMakeRange (i, 1)];
        int digitNum = [digitChar intValue];
        NSLog(@"digitNum: %d", digitNum);
        if(digitNum == 1) decNumber += digitNum * pow(2,i);
    }
    NSLog(@"Decimal version: %d", decNumber);       
}
- (void)viewDidLoad 
{
    [super viewDidLoad];
    [self intToBin:3434];
    [self intToBin:3418];
    [self intToBin:2906];

    [self binToInt:@"110101101010"];
    [self binToInt:@"110101011010"];
    [self binToInt:@"101101011010"];

}

Данные журнала:

[Session started at 2011-03-23 22:05:30 -0500.]
Binary version: 110101101010
Binary version: 110101011010
Binary version: 101101011010
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
Decimal version: 1387
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
Decimal version: 1451
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
Decimal version: 1453





[Session started at 2011-03-23 22:06:46 -0500.]
Binary version: 110101101010
Binary version: 110101011010
Binary version: 101101011010
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
Decimal version: 1387
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
Decimal version: 1451
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 0
digitNum: 1
digitNum: 1
digitNum: 0
digitNum: 1
Decimal version: 1453

Что я пропустил?Есть ли лучший способ сделать это без использования hex?Или с ...

Заранее спасибо за помощь.MP

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Итерируете ли вы строку от 0 до 11 или от 11 до 0, decNumber += digitNum * pow(2,i) устанавливает бит на основе индекса символа.Быстрое решение состоит в том, чтобы использовать pow(2,11-i) вместо этого, поэтому позиция 11 в строке получает 2 ** 0, позиция 10 получает 2 ** 1 и т. Д.

Хотя лучший способ сделать это,будет выглядеть так:

int decNumber = 0;
int i; 
for(i = 0; i <=11; i++)
{
    NSString *digitChar = [theBinary substringWithRange: NSMakeRange (i, 1)];
    int digitNum = [digitChar intValue];
    NSLog(@"digitNum: %d", digitNum);
    decNumber = (decNumber << 1) | (digitNum == 1 ? 1 : 0);
}

При обработке каждой цифры в строке, (decNumber << 1) сдвигает все ранее обработанные биты на 1, а | (digitNum == 1 ? 1 : 0) устанавливает младший бит в числе на0 или 1 на основе только что прочитанного символа.Конечно, это можно улучшить и далее, например, путем более эффективного анализа строки, но я оставлю это в качестве упражнения для читателя.

0 голосов
/ 24 марта 2011

Вы используете строки для представления чисел, это, вероятно, не лучший способ решить то, что вы пытаетесь сделать. Но, тем не менее, чтобы ответить на ваш вопрос, вы увеличиваете неправильный индекс до степени 2. Независимо от того, каким образом вы подсчитываете свой цикл, вы все равно умножаете на те же значения. Когда вы начнете читать строку, цифра first будет наиболее значимой. Вы можете решить эту проблему с помощью

  • сначала инвертирует двоичную строку или
  • используя альтернативную стратегию, чтобы получить десятичное число. (то есть с использованием умножения и сложения по сравнению с использованием pow)

Ваш фиксированный цикл может выглядеть следующим образом ( предупреждение, не проверено ):

...
for(i = 0; i <=11; i++)   // then tried: for(i = 11; i >=0; i--)
{
    int digitNum = [[theBinary substringWithRange: NSMakeRange (i, 1)] intValue];
    NSLog(@"digitNum: %d", digitNum);
    decNumber = decNumber * 2 + digitNum;
}
...

К вашему сведению, этот код в лучшем случае не нужен, а в худшем - неясен. Вы также можете выполнить вышеупомянутое умножение + сложение простым сдвигом и сложением.

...