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

好吧,虽然我仍然遇到问题,但我想要完成的事情相当简单。

这是我的代码:

- (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; } 

这就是我测试它的方式:

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

但是,上面的输出是:

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

因此,它几乎是正确的(就像最后的32位一样),尽管它似乎在重复前32位。 我猜测它与我的long尺寸有关,但sizeof(long)返回8 。 有任何想法吗?

这个表达式:

 long div= 1< 

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

 long div = 1l<