2011-03-24 15 views
0

我發現並修改了一個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 

我錯過了什麼?有沒有更好的方式做到這一點,而不使用十六進制?或與...

在此先感謝您的幫助。 MP

回答

0

無論您是將字符串從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

謝謝,這也工作,但我不知道如何。你能否解釋一下或建議一個鏈接?我將使用這種類型的代碼,我認爲二進制文件將盡可能簡潔。不得不轉換字符串和從字符串轉換真的會破壞我認爲我會找到的任何優點。 – michael 2011-03-24 04:04:26

+0

「binary」(用於一切的內部表示形式)和「二進制編碼爲0和1的字符串」之間存在區別,它是最簡潔的表示形式之一。 – Anomie 2011-03-24 11:50:02

0

您使用字符串來表示數字,這可能不是一個很好的方法來解決你想要做的事情。但是,爲了回答你的問題,你提出了錯誤的索引,以2的權力。無論你以哪種方式計算你的循環,你仍然乘以相同的數量。當你開始閱讀字符串時,第一個數字將是最重要的。您可以通過

  • 解決這個問題,首先扭轉了二進制字符串,或
  • 使用備用策略,讓你的十進制數。 (即用乘法,並增加了與使用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; 
} 
... 

僅供參考,這個代碼是最好的不必要和不明確在最壞的情況。您也可以通過簡單的移位和添加完成上述乘法+加法。

+0

謝謝恩它工作,但我最終使用來自Anomie的代碼,因爲它反映了你們都建議的更改。 – michael 2011-03-24 03:57:27