Преобразование длинного 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, Есть идеи?

2

Решение

Это выражение:

long div= 1<<i;

Это целое число, а не длинное. Итак, вы получите целое число всего в 32 бита (простите, если я говорю только для моей машины). Так что просто создайте 64-битное выражение:

long div = 1l<<i;
5

Другие решения

Других решений пока нет …