#include <iostream>
#include <climits>
#include <cmath>
#include <stdexcept>
using namespace std;

pair<long long, long long> decompose(long long a, long long b) {        // DONT MAKE a < b
	int k = 0;                                  // decompose a to a/b = 2^k + d, d < 2^k
	while (b < a) {
		b <<= 1;
		k++;
	}
	if (b == a) return make_pair(k, 0);
	return make_pair(--k, a - (b>>1));
}

int divide(int dvd, int dvs) {
	if (dvs == 0) throw overflow_error("Divide by zero exception");
	if (dvd == 0) return 0;

	long long ldvd, ldvs;
	ldvd = abs((long long)dvd); ldvs = abs((long long)dvs);
	if (ldvd < ldvs) return 0;

	long long ret = 0;
	pair<long long, long long> kb;
	do{
		kb = decompose(ldvd, ldvs);
		ret += 1 << kb.first;
		ldvd = kb.second;
	} while (kb.second >= ldvs);
	return ((dvd>>31) == (dvs>>31)) ? ret : (~ret + 1);
}

int main() {
	cout << divide(1, -1) << endl;
	cout << divide(2147483647, 1) << endl;
	cout << divide(-1010369383, -2147483648 ) << endl;
	cout << divide(-2147483648, -1) << endl;   // just for fun.
	// your code goes here
	return 0;
}