算術移位實現除法

2021-09-29 01:21:06 字數 1636 閱讀 8796

用移位和加減實現除法,假設環境只能儲存 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編譯器,用...