2013-08-07 1 views
0

Написать функцию rightrot (х, п), которая возвращает значение целого числа х поворачивается вправо на п операцийК & R 2-8 rightrotate (длина целого числа в битах)

могу Посмотрите, как я могу получить бит и поместить их в нужное положение, не требуя длины 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; 

} 
+0

Вы уверены, что вы поняли [** цель упражнения? **] (http://stackoverflow.com/questions/6637578/kr-understanding-exercise-2-8-exactly -what-is-ask-here) – frsfnrrg

ответ

1

Try:

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); 
} 

для цикла должны найти длину в битах x. Он выполняет итерацию по битам n, проверяя, является ли бит высоким; если да, то это длина числа.

Примечание: не производится никаких проверок, что len больше, чем n.

+0

С длиной я имею в виду длину содержимого x. – bryanph

+0

@bryanph Что именно вы имеете в виду с содержимым? Длина типа x (unsigned int), 32 бит? Наименьшее количество бит, необходимых для представления числа без знака ?, так что для 15, 4, для 128, 8, для 1023, 10? – frsfnrrg

+0

Следуя переменным примерам, которые у меня есть в моем коде: Результатом вашего кода будет 1001011, повернутый 3 вправо, становится 1100000000000000000000000001001. Таким образом, это действительно делает самые правые 3 бита в самой левой части целого числа. Я ищу, чтобы получить результат 111001, имея тот же эффект, но сразу же поместив правые биты слева от самых левых битов, которые сдвинуты вправо. Это своего рода путаное объяснение, но я надеюсь, вы понимаете, что я имею в виду. – bryanph

0

Поскольку похоже, что это может быть вопрос о домашнем задании, позвольте мне просто дать вам подсказку, а не полный ответ.

Да, вы можете сделать это без явного использования размера переменной. Вы можете сделать rightrot(x,n), выполнив: rightrot(x,1) n раз. Теперь, как вы делаете rightrot(x,1) без переменного размера? Есть только две возможности самого правого бита x: 0 и 1. Вы можете иметь дело с ними отдельно.

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; 
} 
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 
+0

Не могли бы вы объяснить, почему актеры необходимы в 'msb_1'? – pdoherty926

Смежные вопросы