• Предмет: Информатика
  • Автор: Аноним
  • Вопрос задан 2 года назад

РЕШИТЕ ЗАДАЧУ ПО С++ ДАЮ 25 БАЛЛОВ!!!!!!

Условие
Даны два числа N и K. Требуется изменить число N так, чтобы в K-м бите этого числа в двоичной системе счисления стоял ноль, а все остальные разряды остались неизменными.

В задаче запрещено использовать арифметические операции +, -, *, / и %, а также операторы if / switch и тернарную операцию.

Формат входных данных
В одной строке вводятся два целых числа N и K (0 ⩽ K ⩽ 30, 0 ⩽ N < 231). Разряды нумеруются от младшего к старшему начиная с нуля.

Формат выходных данных
Требуется вывести одно целое число ­— ответ на задачу.

входные данные
21 1
21 2
выходные данные
21
17

Ответы

Ответ дал: Indentuum
3

Код в приложении.

Пояснения:

Посмотрим, как же нам решить задачу. Сначала, поймём как обнулить бит. Бит можно обнулить если использовать логическое И с нулём. Значит, нам нужно использовать логическое И на нужном бите. Как же это сделать? В С++ есть побитовые операции между двумя числами, но побитовое И (&) применяется между всеми битами двух чисел, т.е.

101\ \&amp; \ 110 = (1 \&amp;1)(0\&amp; 1)(1 \&amp; 0) = 100

Заметим, что

a \&amp; 0 = 0\\a \&amp; 1 = a

Числа в С++ с фиксированной разрядностью, т.е. битов всегда определённое кол-во. Исходя из условий задачи, тут нужен int - 32-битный тип.

Тогда, чтобы обнулить нужный бит, нам нужно использовать побитовое И с таким числом, что все его биты, кроме нужного, равны 1.

Добиться этого мы сможем следующим образом. Сдвинем 1 влево на k бит и получим такое число, что все биты, кроме k-го равны 0, а k-ый равен 1, и используем побитовую инверсию (~), т.е. инвертируем каждый бит в числе.

Получив нужное число, выполняем побитовое И и обнуляем k-ый бит.

Как работают примеры:

n = 21 = 10101, \ k = 1\\n \&amp; \sim(1 &lt;&lt; k) = 10101 \&amp; \sim (00010) = 10101 \&amp; 11101 = 10101 = 21

И второй пример:

n = 21 = 10101, \ k = 2\\n \&amp; \sim (1 &lt;&lt; k) = 10101 \&amp; \sim (00100) = 10101 \&amp; 11011 = 10001 = 17

Приложения:
Вас заинтересует