我正在尝试使用以下条件向右旋转:
/*
* rotateRight - Rotate x to the right by n
* Can assume that 0 <= n <= 31
* Legal ops: ~ & ^ | + << >>
* Max ops: 25
* Rating: 3
*/
这是我到目前为止所想到的:
return (x >> n) | (x << (32+ (~n+1))
但是当我使用测试仪时,这会给我一个错误:
ERROR: Test rotateRight(-2147483648[0x80000000],1[0x1]) failed...
...Gives -1073741824[0xc0000000]. Should be 1073741824[0x40000000]
我一直在盯着这一段时间,不知道该做什么(要么改变我的做法和/或改变我的算法)请指点天才!!
答案 0 :(得分:1)
如果没有看到您的确切代码,我将其编入如下程序
#include <stdio.h>
#include <stdint.h>
uint32_t rotateRight( uint32_t x, uint32_t n )
{
return (x >> n) | (x << (32+ (~n+1)) );
}
int main(){
uint32_t value = 0x80000000;
uint32_t newValue;
newValue = rotateRight( value, 1 );
printf( "orig: 0x%8.8x\n", value );
printf( "new: 0x%8.8x\n", newValue );
return 0;
}
运行时,结果如下:
orig: 0x80000000
new: 0x40000000
注意:如果我用uint32_t
替换int
,那么我会得到0xC0000000结果。处理位时,最好使用无符号类型。除了我特意要签名的少数情况外,我总是使用无符号类型。
[编辑:这是一个接受int值的新代码块]
#include <stdio.h>
int rotateRight( int x, int n )
{
return (int)((unsigned)x >> n) | ((unsigned)x << (32+ (~n+1)) );
}
int main(){
int value = -2147483648;
int newValue;
newValue = rotateRight( value, 1 );
printf( "orig: %d\n", value );
printf( "new: %d\n", newValue );
return 0;
}
这给出了输出:
orig: -2147483648
new: 1073741824