Дано целое число 0<= n < 2^32. Нужно узнать количество разрядов для числа n в системе с основанием p. Понятно, что при n=2^32-1 для 2<= p <=16 можно обойтись простой таблицей: Код (Text): Основание: Максимум разрядов: 2 32 3 21 4 16 5 14 6 13 7 12 8 11 9 11 10 10 11 10 ... 16 8 Но хотелось бы узнать, а нет ли общего красивого решения для двоичной машины (без логарифмов)? Если RTFM ткните, пожалуйста, чайника.
Если втупую (псевдокод): Код (Text): nDigits=0; k=1; while (k<=n) { k*=p; ++nDigits; } Перевести на asm, думаю, и сам сможешь. Не забывай при этом про возможное переполнение. Также умножение можно заменить сдвигами и сложениями (у тебя ведь p не больше 16).
Atlantic, спасибо за алго. Опять мы пришли к переводу числа в систему с новым основанием: Код (Text): mov EAX,[n] mov EBX,[p] xor ECX,ECX loopDigCount: xor EDX,EDX div EBX inc ECX or EAX,EAX jnz loopDigCount Получается у нас уже три варианта: линейно-индексный, мультипликативный и соответственно через целочисленное деление. Один другого не слаще. Но вдруг кто-нибудь найдёт решение получше...
В мультипликативном методе можно сократить число умножений, если не перебирать "втупую" все степени, а сначала найти максимальную степень k=2^m =(1, 2, 4, 8, 16, 32) Код (Text): ;uses ebx,edi mov edi,[n] mov eax,[p] xor ecx,ecx inc ecx ;k=1 cmp eax,edi jge found @@: mov ebx,eax ;p^k mul eax ;p^(2*k) add ecx,ecx ;k=2*k cmp eax,edi sbb edx,0 jc @B ;дальше можно и "втупую" ;) shr ecx,1 mov eax,ebx mov ebx,[p] @@: mul ebx add ecx,1 cmp eax,edi sbb edx,0 jc @B found: mov eax,ecx PS: Дальше уменьшать число умножений, заменяя тупой перебор во втором цикле, уже не имеет практического смысла, т.к. штрафы на условных переходах скушают весь выигрыш (в "нормальных" процах штраф за переход примерно равен 3-4-м умножениям)
Вот, еще пришла в голову идея: есть у x86 процев замечательная команда BSR. Зная, сколько бит в числе, по lookup-таблице можно определить, какое минимальное количество цифр в p-ичной системе счисления оно должно содержать. И стартовать тупой цикл сразу с этого числа. Теоретически, теперь этот цикл не должен выполниться больше одного раза