好吧,我想要完成的事情相当简单,尽管我还有问题。
这是我的代码:
- (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
。有什么想法吗?
答案 0 :(得分:5)
这个表达式:
long div= 1<<i;
是一个int,而不是一个long。所以你得到一个只有32位的整数(如果我只说我的机器,请原谅)。所以只产生64位表达式:
long div = 1l<<i;