2
我需要能夠在移位分隔後舍入整數,並且我不能使用mul
或div
指令。移位後組合舍入內部組合
例子:
eax = 745
shr eax, 3
這應該給我的價值93,因爲它截斷其餘部分。但是說浮動值是749,使用shr
指令仍然會給我93的值,即使它通常被舍入到94(學校評分)。
我該如何處理這個問題?
所有我可以用於除法和乘法的是shr
/shl
。
我需要能夠在移位分隔後舍入整數,並且我不能使用mul
或div
指令。移位後組合舍入內部組合
例子:
eax = 745
shr eax, 3
這應該給我的價值93,因爲它截斷其餘部分。但是說浮動值是749,使用shr
指令仍然會給我93的值,即使它通常被舍入到94(學校評分)。
我該如何處理這個問題?
所有我可以用於除法和乘法的是shr
/shl
。
移出的部分是剩餘部分。對於適當的四捨五入,你將只需要它的最後一位,它仍然在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)。
所以,只有第二個例子會被四捨五入。
所有這些都會使得賠率變得相對於平均值而言,它不會檢查餘數是否高於.49 – BKreger
@BKreger - 不,它會正確地回合。我將編輯答案以清理解釋。 – johnfound
感謝它的工作_showhow_ lol – BKreger