是这个链接下的这个回答:
int rotateLeft(int x, int n) {
return (x << n) | (x >> (0x1F & (32 + ~n + 1))) & ~(0xFFFFFFFF << n);
}
//test program
int main(void){
printf("%x
",rotateLeft(0x87654321,4));
printf("%x
",rotateLeft(0x87654321,8));
printf("%x
",rotateLeft(0x80000000,1));
printf("%x
",rotateLeft(0x78123456,4));
printf("%x
",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, 不可缺少. 这样>>是算术位移还是逻辑位移都不重要了, 我觉得对于无符号右移(逻辑右移)其实是不必要的, 但是这样写就不用担心是无符号数还是符号数了.