Собственно есть такая
Цитата
Напишите функцию setbits(x, p, n, y), возвращающую значение x, в котором n битов, начиная с p-й позиции, заменены на n правых разрядов из y (остальные биты не изменяются).
я ее та решил, но при проверки, она не всегда себя ведет "правильно"(Мой алгоритм: обнуляем биты в x, которые будем менять. Сдвигаем правые биты y на позиции в которые их необходимо вставить. Производим побитовое или.
Мое решение:
unsigned setbits(unsigned x, int p, int n, unsigned y){решение некоего Richard Heathfield-а, алагоритм мне не ясен..
return (x & ( ~( ((~0)<<n)^((~0)<<(p+n)) ) )) |
(y&((~((~0) << n)) << p));
}
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n));
}
программа для тестирования, того же Ричарда..
int main(void)
{
unsigned i;
unsigned j;
unsigned k;
int p;
int n;
for(i = 0; i < 30000; i += 511)
{
for(j = 0; j < 1000; j += 37)
{
for(p = 0; p < 16; p++)
{
for(n = 1; n <= p + 1; n++)
{
k = setbits(i, p, n, j);
printf("setbits(%u, %d, %d, %u) = %u\n", i, p, n, j, k);
}
}
}
}
return 0;
}
Упражнение из K&R #2.6. Мой компилятор: gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Где у меня ошибка?
Заранее благодарен.
Сообщение отредактировано: compiler -