除法 cdq和移位 除數為2的冪

2021-08-15 00:25:14 字數 1255 閱讀 3196

c++

printf("nvarone / 8 = %d", nvarone / 8);
彙編**

mov     eax,dword ptr[ebp-4]]

cdqand edx,7 //edx為高位

add eax.edx //eax+(2^n-1),n=3

sar eax,3

push...

call...(printf函式呼叫)

其中cdq作用是將符號位擴充套件到高位。

例如將為負數的-1擴充套件到高位:1111 1111->1111 1111 1111 1111

而正數高位則以0覆蓋:0000 0001->0000 0000 0000 0001

這是因為歷史原因要求被除數的位數需要是除數的兩倍因此需要擴充套件符號位

關於除法(除數為2的冪)

如果為負數,則其補碼需要加上2^n-1後在進行移位

因為計算機是進行除法運算時,是沒有餘數的,是對商進行取整的(靠0取整)

正數為向下取整

9/8 =1
而負數則為向上取整

-9/8=-1
計算機中移位則可以看作為向下取整

0000

1001 >> 3 = 0000

0001

// 1

1111

0111 >> 3 = 1111

1110

// -2 而我們想要的是-1

因此在進行除法運算時,正數可以直接移位就行,而負數不行,需要經行轉換

公式 當b>0時:⌈a / b⌉ =⌊(a+b-1) / b⌋(不證明了)

當負數在進行除法移位時(除數為2的冪) ,(a<0) ,在進行下列公式轉換後才能進行移位

[a/2^n] = ⌈a/2^n⌉ = ⌊(a+2^n-1) / 2^n⌋

這也是為什麼要and edx, 7 add eax.edx的原因

利用移位和減法的除法演算法

楊季文 80x86組合語言程式 p352,子程式 divx 使用移位和減法進行除法運算,嘗試舉例驗證之。程式如下 子程式名 divx 功 能 64 位數除以32 位數,商用64 位表示 入口引數 edx eax 被除數 ebx 除數 出口引數 edx eax 商 ebx 餘數 divx proc n...

除法和乘法的移位處理

用移位實現乘除法運算 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編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...

leetcode 判斷是否為2的冪

判斷給定數是否為2的冪。1.判斷該數是否能被2整除,若不能整除,直接返回false,若能整除,再判斷最後除2的商是否等於1,若等於1,則返回true,否則返回false。2.若乙個數是2的冪數,則它的二進位制表示只存在乙個1,且該1位於二進位制的最右邊。使用 運算,運算 x x 則只保留x二進位制的...