Осуществление: Запишите функцию setbits (x, p, n, y), который возвращает x с n битами, которые начинаются в наборе положения p к самым правым n битам y, оставляя другие биты без изменений.
Моя попытка решения:
#include <stdio.h>
unsigned setbits(unsigned, int, int, unsigned);
int main(void)
{
printf("%u\n", setbits(256, 4, 2, 255));
return 0;
}
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return (x >> (p + 1 - n)) | (1 << (n & y));
}
Это, вероятно, неправильно, но является мной на правильном пути здесь? В противном случае, что я делаю неправильно? Я не уверен относительно того, почему я отлично не понимаю это, но я провел приблизительно час, пытаясь придумать это.
Спасибо.
Вот ваш алгоритм:
. Mask2
. и
X с обратной стороной маски2. и
y с маской и левой сменой P раз. ИЛИ
результаты этих двух операций и возврат этой стоимости. Обратите внимание, что ~0 << i
дает число с наименее значащими i
битами, установленными в 0
, а остальные биты - в 1
. Аналогично, ~(~0 <<< i)
] дает число с наименее значащими i
битами, установленными в 1
, а остальные - в 0
.
Теперь, чтобы решить вашу проблему:
n
, начинающихся с позиции p
, установлены на биты x
. Для этого необходима маска, состоящая из 1
во всех местах, кроме битов n
, начинающихся с позиции p
:
p+1
. p+1-n
битов. и
этой маски с x
дадут вам номер, который вы хотели получить на шаге 1. n
биты набора y
, сдвинутые влево p+1-n
биты.
n
бит, а и
с помощью y
извлечь наименее значащие y
биты n
. p+1-n
бит. |
) получить результаты шага 2 и 3.2, чтобы получить свой номер. Ясно как грязь? :-)
(Вышеприведенный метод не должен зависеть от размера чисел, что я считаю важным)
Редактирование: смотрите на ваше усилие: n & y
ничего не делает с битами n
. Например, если n
равен 8, вы хотите, чтобы последние 8 битов y
, но n & y
просто выберет 4-й бит из y
(8 в двоичном варианте равен 1000). Так что вы знаете, что это не может быть правильно. Аналогично, сдвиг вправо x
p+1-n
раз дает вам число, в котором наиболее значащие p+1-n
биты установлены в ноль, а остальные биты сделаны из наиболее значащих битов x
. Это тоже не то, что вам нужно.