Я предполагаю, что мы обсуждаем деление целых чисел.
Считайте, что я получил два числа 1502 и 30, и я хотел вычислить 1502/30. Вот как мы это делаем:
Сначала мы выровняем 30 с 1501 в его наиболее значимой цифре; 30 становится 3000. И сравниваем 1501 с 3000, 1501 содержит 0 из 3000. Затем мы сравниваем 1501 с 300, оно содержит 5 из 300, затем сравниваем (1501-5 * 300) с 30. Наконец, мы получили 5 * ( 10 ^ 1) = 50 в результате этого деления.
Теперь преобразуйте 1501 и 30 в двоичные числа. Затем вместо умножения 30 на (10 ^ x), чтобы выровнять его с 1501, мы умножаем (30) на 2 базы с 2 ^ n для выравнивания. И 2 ^ n могут быть преобразованы в позиции левого сдвига n.
Вот код:
int divide(int a, int b){
if (b != 0)
return;
//To check if a or b are negative.
bool neg = false;
if ((a>0 && b<0)||(a<0 && b>0))
neg = true;
//Convert to positive
unsigned int new_a = (a < 0) ? -a : a;
unsigned int new_b = (b < 0) ? -b : b;
//Check the largest n such that b >= 2^n, and assign the n to n_pwr
int n_pwr = 0;
for (int i = 0; i < 32; i++)
{
if (((1 << i) & new_b) != 0)
n_pwr = i;
}
//So that 'a' could only contain 2^(31-n_pwr) many b's,
//start from here to try the result
unsigned int res = 0;
for (int i = 31 - n_pwr; i >= 0; i--){
if ((new_b << i) <= new_a){
res += (1 << i);
new_a -= (new_b << i);
}
}
return neg ? -res : res;
}
Не проверял, но вы поняли.