0

整数 x を n 回右に回転させた値を返す関数 rightrot(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

4 に答える 4

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 に答える
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 に答える