Rover12421's Blog

The End.

不用分支语句求整数的绝对值

/
    不用分支语句求整数的绝对值
/
int compute_int_abs_whihout_branching(int v)
{
    unsigned int r;
    //右移保存v的符号位到mask
    int const mask = v >> sizeof(int)
CHAR_BIT - 1;

    printf(“mask<%d>\n, mask);
   
    //method 1
    //v>=0, mask=0, (v+0)0=v
    //v<0, mask=-1,(v+(-1))-1=减一取反
    r = (v + mask) ^ mask;
    printf(“1:r<%d>\n, r);
   
    //method 2
    //v>=0, mask=0,(v0)-0=v-0=v
    //v<0,mask=-1,(v^-1)-(-1)=取反加一
    r = (v ^ mask) - mask;
    printf(“2:r<%d>\n, r);
   
    //method 3
    //最前面的()里同compute_int_sign种的method 4,根据符号值返回+1,-1
    //正正得正,负负得正
    r = (+1 | (v >> (sizeof(int) CHAR_BIT - 1))) v;
    printf(“3:r<%d>\n, r);
   
    //method 4
    //使用了分支
    r = (v < ) ? (1 + ((unsigned)(-1 - v))) : (unsigned)v;
    printf(“4:r<%d>\n, r);

    return r;
}

Comments