【问题标题】:Rounding an Int after shift division Assembly在移位除法程序集后舍入一个 Int
【发布时间】:2013-10-21 03:54:27
【问题描述】:

我需要能够在移位除法后对整数进行舍入,我不能使用muldiv 指令。

例子:

eax = 745

shr  eax, 3

这应该给我 93 的值,因为它会截断余数。但是假设浮点值为 749,使用 shr 指令仍然会给我值 93,即使它通常会四舍五入为 94(学校评分)。

我将如何处理这个问题?

我能用于除法和乘法的只有shr/shl

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    移出的部分是余数。为了正确舍入,您只需要最后一点,它会保留在 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 答案编辑了一些解释。
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2021-03-13
    相关资源
    最近更新 更多