K& R 2-8 rightrotate(以位为单位的整数长度)

时间:2013-08-07 18:48:00

标签: c bits

  

写一个函数rightrot(x,n),它返回整数x的值   通过n次操作向右旋转

我无法看到如何获取这些位并将它们放在正确的位置而不需要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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

是的,您可以在不明确使用变量大小的情况下执行此操作。您可以执行rightrot(x,n) n次rightrot(x,1)。现在,如果没有可变大小,你如何做rightrot(x,1)x最右边的位只有两种可能:0和1.你可以单独处理它们。

答案 2 :(得分: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;
}

答案 3 :(得分: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