旋转右位

时间:2015-10-12 02:09:05

标签: c bit-manipulation bit

我正在尝试使用以下条件向右旋转:

 /*
  * 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]

我一直在盯着这一段时间,不知道该做什么(要么改变我的做法和/或改变我的算法)请指点天才!!

1 个答案:

答案 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