用移位和加減實現除法,假設環境只能儲存 32 位有符號整數
// 不考慮正負 不考慮越界
intmy_divide
(int dividend,
int divisor,
int& remainder)
//b 100000
//tmp 1000 tmp為b翻的倍數
while
(a >0)
else
b >>=1;
}}return res;
}
考慮正負和越界,注意點:
負數轉為正數,-2147483648 無法轉化為 2147483648
過程中的任何<< , >>要考慮越界問題;
直接越界
直接返回0
先用max / x 餘數=x-1 (先看res = max及 兩個數的符號 ) 則res+1
// -2147483648 / -2147483648 1
// -2147483648 / -1 越界
// -2147483648 / 1 min
min/(2的整數倍)時會少1
當被除數為min時要看 餘數+1,除數 兩者相等則要res +1
僅x = -2147483648時為1; 其餘都為0
int
divide
(int dividend,
int divisor)
if(dividend ==0)
if(dividend == int32_min && divisor == int32_min)
if(dividend == int32_min && divisor ==-1
)if(dividend == int32_min && divisor ==1)
if(divisor == int32_min)
int min =0;
//除數是min
int flag =1;
//結果的正負 1 -1
if(dividend == int32_min)
divisor =
abs(divisor)
; min =1;
}else
}int remainder =0;
int res =
my_divide
(dividend, divisor, remainder)
;// cout << "符號:" << flag << endl;
// cout << "結果:" << res << endl;
// cout << "餘數" << remainder << endl;
if(min ==
1&& remainder+
1== divisor)
// cout << "res:" << flag*res << endl;
// cout << endl;
return res;
}
移位實現的乘除法
移位實現的乘除法比直接乘除的效率高很多。用移位實現乘除法運算 a a 4 b b 4 可以改為 a a 2 b b 2 說明 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的c編譯器,用...
算術移位邏輯移位
unsigned int i 8 int main 請問 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。邏輯移位是指邏輯左移和邏輯...
移位乘除法
移位實現的乘除法比直接乘除的效率高很多。用移位實現乘除法運算 a a 4 b b 4 可以改為 a a 2 b b 2 說明 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的c編譯器,用...