k&r осуществляют беспорядок с битовыми операциями

Осуществление: Запишите функцию 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));
}

Это, вероятно, неправильно, но является мной на правильном пути здесь? В противном случае, что я делаю неправильно? Я не уверен относительно того, почему я отлично не понимаю это, но я провел приблизительно час, пытаясь придумать это.

Спасибо.

5
задан svr 16 January 2010 в 03:24
поделиться

2 ответа

Вот ваш алгоритм:

  1. , если n равно 0, вернуть x.
  2. Возьмите 1, и оставить сдвиг его N раз, а затем вычесть 1. Вызовите эту маску .
  3. Левая смета MASK P RUE Вызовите это Mask2 .
  4. и X с обратной стороной маски2. и y с маской и левой сменой P раз.
  5. ИЛИ результаты этих двух операций и возврат этой стоимости.
5
ответ дан 14 December 2019 в 08:51
поделиться

Обратите внимание, что ~0 << i дает число с наименее значащими i битами, установленными в 0, а остальные биты - в 1. Аналогично, ~(~0 <<< i)] дает число с наименее значащими i битами, установленными в 1, а остальные - в 0.

Теперь, чтобы решить вашу проблему:

  1. Сначала вам нужно число, в котором все биты, кроме битов n, начинающихся с позиции p, установлены на биты x. Для этого необходима маска, состоящая из 1 во всех местах, кроме битов n, начинающихся с позиции p:
    1. в этой маске установлены самые верхние (самые значащие) биты, начинающиеся с бита в позиции p+1.
    2. эта маска также имеет набор младших значащих p+1-n битов.
  2. Как только вы получите вышеуказанную маску, и этой маски с x дадут вам номер, который вы хотели получить на шаге 1.
  3. Теперь вам нужно число, которое имеет наименее значащие n биты набора y, сдвинутые влево p+1-n биты.
    1. Можно легко создать маску, в которой будут установлены только наименее значащие n бит, а и с помощью y извлечь наименее значащие y биты n.
    2. Затем можно сдвинуть это число на p+1-n бит.
  4. Наконец, вы можете битовым способом - или (|) получить результаты шага 2 и 3.2, чтобы получить свой номер.

Ясно как грязь? :-)

(Вышеприведенный метод не должен зависеть от размера чисел, что я считаю важным)

Редактирование: смотрите на ваше усилие: n & y ничего не делает с битами n. Например, если n равен 8, вы хотите, чтобы последние 8 битов y, но n & y просто выберет 4-й бит из y (8 в двоичном варианте равен 1000). Так что вы знаете, что это не может быть правильно. Аналогично, сдвиг вправо x p+1-n раз дает вам число, в котором наиболее значащие p+1-n биты установлены в ноль, а остальные биты сделаны из наиболее значащих битов x. Это тоже не то, что вам нужно.

0
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: