我发现并修改了一个似乎正常工作的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)
您使用字符串来表示数字,这可能不是解决您尝试做的事情的好方法。但是,要回答你的问题,你将错误的指数提升到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刚看完它肯定可以进一步改进,例如通过更有效地解析字符串,但我将把它作为读者的练习。