将长64位十进制转换为二进制

Dr.*_*eon 2 c c++ binary cocoa objective-c

好吧,我想要完成的事情是相当简单的,尽管我还有问题.

这是我的代码:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

这就是我测试它的方式:

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

但是,上面的输出是:

1 = 0000000000000000000000000000000100000000000000000000000000000001
2 = 0000000000000000000000000000001000000000000000000000000000000010
3 = 0000000000000000000000000000001100000000000000000000000000000011
4 = 0000000000000000000000000000010000000000000000000000000000000100
5 = 0000000000000000000000000000010100000000000000000000000000000101
6 = 0000000000000000000000000000011000000000000000000000000000000110
7 = 0000000000000000000000000000011100000000000000000000000000000111
8 = 0000000000000000000000000000100000000000000000000000000000001000
9 = 0000000000000000000000000000100100000000000000000000000000001001
Run Code Online (Sandbox Code Playgroud)

因此,它几乎是正确的(对于最后的32位),尽管它似乎是重复自己的前32位.我猜这与我的long体型有关,但是sizeof(long)回归8.有任何想法吗?

Ram*_*uri 5

这个表达式:

long div= 1<<i;
Run Code Online (Sandbox Code Playgroud)

是一个int,而不是一个long.所以你得到一个只有32位的整数(原谅如果我只说我的机器).所以只产生一个64位表达式:

long div = 1l<<i;
Run Code Online (Sandbox Code Playgroud)