如何将输入除以2然后向上舍入

时间:2016-03-03 19:49:37

标签: assembly x86

我不完全理解汇编程序中的div概念,我所知道的是,商存储在EAX中,其余部分存储在EDX中。但是我试图弄清楚如何将用户输入除以2,如果有剩余则将其四舍五入。例如:

  • N = 3/2 = 1.5,最大为2
  • N = 9/2 = 4.5最多5
  • N = 4/2 = 2

4 个答案:

答案 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 / 2n >> 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并且为已签名的数字下限

移出的位进入进位标志,因此要进行舍入,您可以将其添加回来。