题解
func divide(dividend int, divisor int) int {
// 1. 特殊情况:结果为 2^31 溢出
if dividend == math.MinInt32 && divisor == -1 {
return math.MaxInt32
}
// 2. 特殊情况:
if divisor == 0 {
return 0
}
// sign == 2 || sign == 0 则说明除数和被除数同号
// sign == 1 则说明除数和被除数异号
var sign = 2
if dividend > 0 {
dividend = -dividend
sign--
}
if divisor > 0 {
divisor = -divisor
sign--
}
// 1. sign == 2 || sign == 0 则说明除数和被除数同号
// 2. sign == 1 则说明除数和被除数异号
var result = 0
// 因为除数和被除数都是负数
for dividend <= divisor {
var temp_result = 1
var temp_divisor = divisor
// 试探被除数最多能被多少个除数去除
for dividend < (temp_divisor << 1) {
temp_divisor <<= 1
temp_result <<= 1
}
dividend -= temp_divisor
result += temp_result
}
if sign == 1 {
return -result
}
return result
}
要点
-
在计算机中,整数通常以补码的形式存储和表示,需要理解原码、反码和补码的含义以及各自怎么转换。由于 -2^31 的绝对值还是 -2^31,所以在题解中,把被除数和除数都转换成负数进行运算。
-
在计算被除数最多能减掉多少个除数的时候,是有位运算 << 来缩短计算的步骤,以达到提效的目的。