一段计算rotateLeft的代码

这个链接下的这个回答:

int rotateLeft(int x, int n) {
    return (x << n) | (x >> (0x1F & (32 + ~n + 1))) & ~(0xFFFFFFFF << n);
}

//test program
int main(void){
    printf("%x\n",rotateLeft(0x87654321,4));
    printf("%x\n",rotateLeft(0x87654321,8));
    printf("%x\n",rotateLeft(0x80000000,1));
    printf("%x\n",rotateLeft(0x78123456,4));
    printf("%x\n",rotateLeft(0xFFFFFFFF,4));
    return 0;
}

它是怎么work的呢?

x<<n没什么好说的, (x >> (0x1F & (32 + ~n + 1)))
32+~n+1等价于32-n. 为什么? a+~n+1=a+2^32-n-1+1=a-n. 所以不仅是对32成立.
&0x1f, 其实是在取最低5位. 这是因为n未必在0到31的范围内.
~(0xFFFFFFFF << n), 保证只有最低n位不为0, 不可缺少. 这样>>是算术位移还是逻辑位移都不重要了, 我觉得对于无符号右移(逻辑右移)其实是不必要的, 但是这样写就不用担心是无符号数还是符号数了.

posted @ 2021-08-05 17:58  Tokubara  阅读(214)  评论(0编辑  收藏  举报