向上翻n/4的有效方法

Mar*_*rco 3 c algorithm math optimization rounding

我有一个整数n,我需要向上舍入n/4.出于性能原因,我需要在C中找到一个快速的方法.除以4可以使用>> 2移位操作来完成,但我不知道该轮.我可以使用ceil,但我担心性能.

abl*_*igh 8

如果你的操作数是非负的,那么:

unsigned int
roundupdiv4 (unsigned int n)
{
    return (n+3)>>2;
}
Run Code Online (Sandbox Code Playgroud)

请注意,任何合理的编译器都会编译/4unsigned 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)