0

编写一个函数 rightrot(x,n),返回向右旋转 n 次的整数 x 的值

我看不出如何在不需要 x 长度(位数)的情况下获取这些位并将它们放在正确的位置。

我是在想错还是我真的需要以某种方式获得 x 的长度?如果是这样,我将如何获得这个长度的 x?

顺便说一下,下面的代码可能是错误的,我只是将 length_x 放入以演示我的问题。
我希望有人能指出我正确的方向。

#include <stdio.h>

unsigned rightrot(unsigned x, int n);

main()
{
    unsigned x = 75;
    int p, n, y;
    p = 5;
    n = 3;
    y = 45;

    printf("%u\n",rightrot(x,n));
}



unsigned rightrot(unsigned x, int n)
{

    oldn = (x & ~(~0 << n)) << length_x;

    x = x >> n | oldn;
    return x;

}
4

4 回答 4

1

尝试:

unsigned int rrot(unsigned int x, int n) {
     int len;
     for (len=31;len>=0 && !((1 << len) & x);len--);
     len++;

     return ((x >> n) | (x << (len - n)) & ((1 << len) - 1);
}

for 循环应该找到以 为单位的长度x。它沿着 n 的位迭代,检查该位是否为高;如果是这样,那就是数字的长度。

注意:不进行len大于 的检查n

于 2013-08-07T19:00:05.997 回答
0

因为看起来这可能是一个家庭作业问题,所以让我给你一个提示而不是完整的答案。

是的,您可以在不明确使用变量大小的情况下做到这一点。您可以rightrot(x,n)通过执行rightrot(x,1)n 次来完成。现在rightrot(x,1)没有可变大小怎么办?最右边的位只有两种可能x:0和1,可以分别处理。

于 2013-08-07T19:28:15.293 回答
0
int nlz(unsigned x);
// 75 : 1001011 -> 3 bit shift right -> 57 : 111001
unsigned rightrot(unsigned x, int n){
    int length_x = 32 - nlz(x);//32 : unsigned int is assumed to be a 32-bit
    unsigned mask = (1 << length_x) - 1;

    return (x >> n) | mask & (x << (length_x - n));

}

//count zero bit from left
int nlz(unsigned x) {
    int y, m, n;

    y = - (x >> 16);
    m = (y >> 16) & 16;
    n = 16 - m;
    x = x >> m;

    y = x - 0x100;
    m = (y >> 16) & 8;
    n = n + m;
    x = x << m;

    y = x - 0x1000;
    m = (y >> 16) & 4;
    n = n + m;
    x = x  << m;

    y = x - 0x4000;
    m = (y >> 16) & 2;
    n = n + m;
    x = x  << m;

    y = x >> 14;
    m = y & ~(y >> 1);
    return n + 2 - m;
}
于 2013-08-08T11:08:46.277 回答
0
unsigned rightRot(unsigned x, int n){
    unsigned msb_1=~(~(unsigned)0 >> 1);

    for(int i=0; i<n; i++){
        if(x&1) {x=(x >>1)|msb_1;}
        else {x=x>>1;}
    }

    return x;
}//problem K&R
于 2014-03-16T14:41:26.963 回答