круговой сдвиг c

Я должен сдвинуть на одно место вправо и вернуть его

В Java я могу просто вернуть n >> 1;

Возможно ли это в C?

Метод, который нам дали, заключается в следующем.

// Return n after a right circular 1-bit shift
unsigned int right_circular_shift_1(unsigned int n) {

person simion    schedule 31.05.2010    source источник
comment
Ни в C, ни в Java нет >> кругового сдвига.   -  person Johannes Schaub - litb    schedule 31.05.2010
comment
Кажется, это решение работает. Теперь ваше домашнее задание — расшифровать его: ((n >> 1) | (((n & 1) + (((unsigned int)-1)>>1)) & ~(((unsigned int)-1)>>1))) xD   -  person Johannes Schaub - litb    schedule 31.05.2010
comment
это была не домашняя работа, это повторение для экзамена :D в конце концов я получил это, спасибо всем за помощь   -  person simion    schedule 31.05.2010


Ответы (2)


C не имеет кругового сдвига, поэтому я предполагаю, что упражнение состоит в том, чтобы реализовать его. Способ сделать это для левого кругового сдвига:

- get the current leftmost bit  and save it
- shift the number leftwards by one
- or the saved bit in at the rightmost bit position

Для правого кругового смещения:

- get the current rightmost bit  and save it
- shift the number rightwards by one
- or the saved bit in at the leftmost bit position
person Community    schedule 31.05.2010
comment
За исключением того, что это неправильный путь. ОП хотел ПРАВЫЙ круговой сдвиг (если он вообще хотел круговой сдвиг ...), то есть захватить нижний бит, сдвинуть вправо или в предыдущем нижнем бите вверху. - person Julian; 31.05.2010
comment
@Julian True - я изменил свой ответ. - person ; 31.05.2010
comment
Оставшаяся сложная часть — получить позицию самого левого бита. Я показал способ, но потом увидел домашнее задание и поэтому удалил свой ответ :) - person Johannes Schaub - litb; 31.05.2010
comment
@Johannes Я думаю, я бы сделал небольшой хак и жестко закодировал его для конкретной платформы, для которой я писал, особенно для домашней работы :-) - person ; 31.05.2010
comment
Кстати +1 за хорошее руководство. Я думаю, ты был бы отличным учителем :) - person Johannes Schaub - litb; 31.05.2010

Вы не пробовали?

n >> 1

Это будет работать в C (и других языках на основе C), как и в Java (хотя и не циклично).

person Johnsyweb    schedule 31.05.2010
comment
Мне было бы интересно узнать, почему за это проголосовали. ОП не представил никаких доказательств того, что они пытались это сделать, прежде чем спросить, возможно ли это; независимо от того, круглая ли она. Кроме того, что они заявляют, я должен сдвинуть in на одно место вправо и вернуть его. - person Johnsyweb; 31.05.2010