我不完全理解汇编程序中的div概念,我所知道的是,商存储在EAX中,其余部分存储在EDX中。但是我试图弄清楚如何将用户输入除以2,如果有剩余则将其四舍五入。例如:
答案 0 :(得分:3)
要除以2,将寄存器右移一个位置。低位移入进位标志。
因此,如果数字是偶数,则0转移到CF.如果数字是奇数,则1移入CF.
所以,要除以2并向上舍入,你向右移动一个位置,然后加上进位标志的值:
; assume that the value is in EAX
shr eax, 1 ; divide by 2. Low bit into Carry flag
adc eax, 0 ; add the value of the Carry flag
答案 1 :(得分:1)
除分子是最大值的情况外,你可以在除以2之前加1来进行向上舍入。例子
6 / 2 = 3.0 (6 + 1) / 2 = 3 // remains the same
7 / 2 = 3.5 (7 + 1) / 2 = 4 // is rounded up
在一般情况下,如果您希望除以n
并向上舍入,请在分割前添加n / 2
或n >> 1
。在n
是偶数的情况下,结果显然是好的。 n
奇怪的地方就像这个例子除以5一样,你加5 / 2
,即2
5 / 5 = 1.0 (5 + 2) / 5 = 1 // remains the same
6 / 5 = 1.2 (6 + 2) / 5 = 1 // rounded down
7 / 5 = 1.4 (7 + 2) / 5 = 1 // rounded down
8 / 5 = 1.6 (8 + 2) / 5 = 2 // rounded up
9 / 5 = 1.8 (9 + 2) / 5 = 2 // rounded up
答案 2 :(得分:0)
N = (3 + 2 - 1) / 2
xor edx, edx
add eax, ecx
dec eax
div ecx
或者如果2是常数:
inc eax
shr eax, 1
答案 3 :(得分:0)
这里有很多想法:
copy
操作费用昂贵,Files.copy(file1.toPath(), file2.toPath(), StandardCopyOption.REPLACE_EXISTING);
更快 div
除以2和无符号数字
shr
除以2并且为已签名的数字下限
移出的位进入进位标志,因此要进行舍入,您可以将其添加回来。