2013-10-21 64 views
2

我需要能夠在移位分隔後舍入整數,並且我不能使用muldiv指令。移位後組合舍入內部組合

例子:

eax = 745 

shr eax, 3 

這應該給我的價值93,因爲它截斷其餘部分。但是說浮動值是749,使用shr指令仍然會給我93的值,即使它通常被舍入到94(學校評分)。

我該如何處理這個問題?

所有我可以用於除法和乘法的是shr/shl

回答

2

移出的部分是剩餘部分。對於適當的四捨五入,你將只需要它的最後一位,它仍然在CF:

shr eax, 3 ; div by 8, the last shifted bit is in the CF 
    adc eax, 0 ; if CF=1 eax will be increased by 1 

它是如何工作的?當通過移位進行劃分時,餘數被包含在移出的位中:

745 = $2e9 = 001011101001 
749 = $2ed = 001011101101 

右移時,最低的3位將被移出。請注意,只有最後一個移位的位將保持在CF(由「^」指出),它是餘數的最高位:

001011101001 shl 3 = 0000 0101 1101|001 = $05d|1 = 93 and remainder 1 (0 in CF) 
            ^

001011101101 shl 3 = 0000 0101 1101|101 = $05d|5 = 93 and remainder 5 (1 in CF) 
            ^

對於所有可能的剩餘物(0..111),這些用0最高位是000,001,010和011(0..3),高位爲1的是100,101,110和111(4..7)。

所以,只有第二個例子會被四捨五入。

+0

所有這些都會使得賠率變得相對於平均值而言,它不會檢查餘數是否高於.49 – BKreger

+0

@BKreger - 不,它會正確地回合。我將編輯答案以清理解釋。 – johnfound

+0

感謝它的工作_showhow_ lol – BKreger