Binary 由于二进制位转换而陷入困境

Binary 由于二进制位转换而陷入困境,binary,int,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

我发现并修改了一个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"];

}
我错过了什么?有没有更好的方法不用十六进制就可以做到这一点?或与

提前感谢您的帮助。
MP

您使用字符串来表示数字,这可能不是解决您要做的事情的好方法。但是,为了回答您的问题,您将错误的索引提高到了2的幂。无论以何种方式计算循环,都会乘以相同的索引。当您开始读取字符串时,第一个数字将是最重要的。你可以通过以下方法解决这个问题

  • 首先反转二进制字符串,或者
  • 使用另一种策略获取十进制数。(即使用乘法和加法与使用
    pow
您的固定循环可能看起来像(警告,未测试)):

。。。
对于(i=0;i=0;i--)
{
int-digitNum=[[theBinary substringWithRange:NSMakeRange(i,1)]intValue];
NSLog(@“digitNum:%d”,digitNum);
decNumber=decNumber*2+digitNum;
}
...

仅供参考,该代码充其量是不必要的,充其量是不明确的。您还可以通过简单的移位和加法来完成上述乘法+加法。

无论您是将字符串从0迭代到11还是从11迭代到0,
decnume+=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);
}
int decNumber=0;
int i;

对于(i=0;我感谢Yan,它起了作用,但我最终使用了Anomie的代码,因为它反映了你们两人建议的更改。谢谢,这也起了作用,但我不确定如何。你能解释一下或建议一个链接吗?我将使用这种类型的代码的allot,我认为二进制将尽可能简洁。必须转换为str或从str转换ings真的摧毁了我认为我会发现的任何优势。在“二进制”(用于所有事物的内部表示)和“二进制编码为0和1的字符串”(这是最不简洁的表示)之间存在差异。
...
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;
}
...
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);
}