Проблема: Упражнение 2-8 языка программирования C: «Напишите функцию rightrot (x, n), которая возвращает значение целого числа x, повернутого вправо на n позиций».
Я сделал это всеми способами, которые я знаю, как.Вот проблема, которая у меня возникла.Возьмите определенное число для этого упражнения, скажем, 29, и поверните его вправо на одну позицию.
11101, и оно станет 11110 или 30. Скажем, ради аргумента, что система, над которой мы работаем, имеет размер целого типа без знака:32 битаДалее, скажем, что число 29 хранится в целочисленной переменной без знака.В памяти число будет иметь 27 нулей впереди.Поэтому, когда мы поворачиваем 29 вправо, используя один из нескольких алгоритмов, которые мои опубликованы ниже, мы получаем число 2147483662. Это явно не желаемый результат.
unsigned int rightrot(unsigned x, int n) {
return (x >> n) | (x << (sizeof(x) * CHAR_BIT) - n);
}
Технически, это правильно, но я думалчто 27 нулей перед 11101 были незначительными.Я также попробовал несколько других решений:
int wordsize(void) { // compute the wordsize on a given machine...
unsigned x = ~0;
int b;
for(b = 0; x; b++)
x &= x-1;
return x;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
while(n --) {
rbit = x >> 1;
x |= (rbit << wordsize() - 1);
}
return x;
Это последнее и последнее решение, где я думал, что оно у меня есть, я объясню, где оно не получилось, как только я доберусь до конца.Я уверен, что вы увидите мою ошибку ...
int bitcount(unsigned x) {
int b;
for(b = 0; x; b++)
x &= x-1;
return b;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
int shift = bitcount(x);
while(n--) {
rbit = x & 1;
x >>= 1;
x |= (rbit << shift);
}
}
Это решение дает ожидаемый ответ 30, который я искал, но если вы используете число для x, как, скажем, 31 (11111), то есть проблемы, в частности, результат 47, используя один для п.Я не думал об этом раньше, но если используется число типа 8 (1000), тогда хаос.В 8 есть только один установленный бит, поэтому сдвиг, скорее всего, будет неправильным.Моя теория на данный момент заключается в том, что первые два решения верны (в основном), и я просто что-то упускаю ...