通过二进制位转换进行标记

时间:2011-03-24 03:20:35

标签: binary int

我发现并修改了一个似乎正常工作的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

2 个答案:

答案 0 :(得分: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;
}
...

仅供参考,这段代码充其量是不必要的,最糟糕的是不清楚。您还可以通过简单的移位完成上述乘法+加法并添加。

答案 1 :(得分: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刚看完它肯定可以进一步改进,例如通过更有效地解析字符串,但我将把它作为读者的练习。