Я искал самый быстрый способ вычисления квадратного корня (целое число) числа (целое число). Я наткнулся на это решение в википедии, который находит квадратный корень числа (если его идеальный квадрат) или корень квадратный из его ближайшего нижнего полного квадрата (если данное число не является полным квадратом:Каков самый быстрый способ найти целочисленный квадратный корень с использованием сдвигов бит?
short isqrt(short num) {
short res = 0;
short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
// "bit" starts at the highest power of four <= the argument.
while (bit > num)
bit >>= 2;
while (bit != 0) {
if (num >= res + bit) {
num -= res + bit;
res = (res >> 1) + bit;
}
else
res >>= 1;
bit >>= 2;
}
return res;
}
Я пробовал много пробных прогонов, чтобы проследить алгоритм, но я, кажется, не понимаю часть внутри while(bit!=0)
. Может кто-нибудь объяснить эту часть мне?