Mar*_*rco 3 c algorithm math optimization rounding
我有一个整数n,我需要向上舍入n/4.出于性能原因,我需要在C中找到一个快速的方法.除以4可以使用>> 2移位操作来完成,但我不知道该轮.我可以使用ceil,但我担心性能.
如果你的操作数是非负的,那么:
unsigned int
roundupdiv4 (unsigned int n)
{
return (n+3)>>2;
}
Run Code Online (Sandbox Code Playgroud)
请注意,任何合理的编译器都会编译/4为unsigned intas >>2.
我可以通过编译以上内容来确认gcc -O3 -S:
.file "x.c"
.text
.p2align 4,,15
.globl roundupdiv4
.type roundupdiv4, @function
roundupdiv4:
.LFB0:
.cfi_startproc
leal 3(%rdi), %eax
shrl $2, %eax
ret
.cfi_endproc
.LFE0:
.size roundupdiv4, .-roundupdiv4
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
并查看输出的是完全一样的,如果我取代>>2的/4.
另外请注意,我用unsigned int的>>是负号的左操作数定义(即右移负值)执行.如果你想要一个可以用于签名值的工作(严格上调):
int
roundupdiv4 (int n)
{
return ((n>0)?(n+3):n)/4;
}
Run Code Online (Sandbox Code Playgroud)
因为整数除法使用截断舍入,即无论如何舍入为负数(朝零).(这是针对C99的 ;它是在C89中定义的实现).
如果通过向上舍入,你的意思是"从零开始",那么:
int
roundawayfromzerodiv4 (int n)
{
return ((n>0)?(n+3):(n-3))/4;
}
Run Code Online (Sandbox Code Playgroud)