2

OK, what I'm trying to accomplish is fairly straightforward although I'm still having issues.

This is my code :

- (NSString*)toBin:(long)dec
{
    long num = dec;
    NSString *res = [NSString string];

    for (long i=63; i>=0; i--)
    {
        long div = 1<<i;
        if ((num&div)==div) res = [res stringByAppendingString:@"1"];
        else res = [res stringByAppendingString:@"0"];
    }

    return res;
}

And this is how I'm testing it :

    for (long i=1; i<10; i++)
    {
        NSLog(@"%u = %@",i,[self toBin:(long)i]);
    }

However, the output of the above is :

1 = 0000000000000000000000000000000100000000000000000000000000000001
2 = 0000000000000000000000000000001000000000000000000000000000000010
3 = 0000000000000000000000000000001100000000000000000000000000000011
4 = 0000000000000000000000000000010000000000000000000000000000000100
5 = 0000000000000000000000000000010100000000000000000000000000000101
6 = 0000000000000000000000000000011000000000000000000000000000000110
7 = 0000000000000000000000000000011100000000000000000000000000000111
8 = 0000000000000000000000000000100000000000000000000000000000001000
9 = 0000000000000000000000000000100100000000000000000000000000001001

So, it's almost correct (as for the last 32 bits), though it seems to be duplicating itself for the top 32 bits. I guessed it had something to do with my long size, but sizeof(long) returns 8. Any ideas?

Dr.Kameleon
  • 22,532
  • 20
  • 115
  • 223

1 Answers1

5

This expression:

long div= 1<<i;

Is an int, not a long.So you get an integer of just 32 bits (pardon if I speak only for my machine).So just produce a 64 bit expression:

long div = 1l<<i;
Ramy Al Zuhouri
  • 21,580
  • 26
  • 105
  • 187