Как установить в 0 определенные биты?

95
07 ноября 2021, 08:40

Имеется такая задача:

Установить в 0 в числе А n битов вправо от позиции p, заменить ими m битов числа В, начиная с позиции q.

И моя попытка решить ее, но происходит не установка битов в 0, а инвертирование

int A, n, p; char num[33];
  cout << "Введите число А ";
  cin >> A;
  cout << endl;
  cout << "Введите c какого бита начинать замену ";
  cin >> p;
  cout << endl;
  cout << "Скольно битов заменяем на 0 ";
  cin >> n;
  cout << endl;
  //Просто вывод числа в двоичном виде
  _itoa_s(A, num, 2);
  cout << "Число А в двоичном  виде: " << num << endl;
  //Создаю маску, одна равна единице, которая сдвинута на p-1 влево
  unsigned int mask = 1 << p-1;

  //Далее идет замена в нули, но т.к. я не знаю, как правильно это сделать, происходит инвертирование
  for (int i = 0; i <= n; i++) {
    A ^= mask;
    mask <<= 1;
  }
  _itoa_s(A, num, 2);
  cout << "Итоговое число: " << num << endl;

Желательно с подробным объяснением

Answer 1

Сталкивался уже с подобной задачей, которая звучала как-то так:

Установить в 0 n битов в числе А влево от позиции p


    char buffer[33];
    std::cout << "Enter number A: ";
    int a;
    std::cin >> a;
    _itoa_s(a, buffer, 2);
    std::cout << "A in binary = " << buffer << '\n';
    std::cout << "How much bits your are want to make into '0': ";
    int n;
    std::cin >> n;
    int position = -1;
    while (position < 1)
    {
        std::cout << "From what position would you like to do it: ";
        std::cin >> position;
    }
    unsigned int mask = (1 << n) - 1;
    a &= ~(mask << (position - 1));
    _itoa_s(a, buffer, 2);
    std::cout << "\nA in binary after all transformations: " << buffer << "\nIt's " << a << " in decimal.\n";
Answer 2

Вот Вам способ замены конкретного бита на 0 или же на 1, как прикрутить сюда обработку нескольких битов, я думаю вы знаете)

#include <iostream>
#include <bitset>
int main()
{
    auto n{0b100001};
    unsigned int pos{1}; // позиция бита
    if (pos >= sizeof(n)) {
        return -1;
    }
    bool new_bit{1}; // 0 или 1 (что задать в бит на pos) bool для защиты от мусора ибо если указать что-то отличное - будет нп
    std::cout << "before : " << std::bitset<16>(n) << std::endl;
    n = (n & ~(1UL << pos)) | (new_bit << pos);
    std::cout << "after : " << std::bitset<16>(n) << std::endl;
    return 0;
}
READ ALSO
Цикличное выполнение ajax на click

Цикличное выполнение ajax на click

Есть вот такой вызов ajax, который работает по клику на option

167
Как правильно написать игру - угадай число [закрыт]

Как правильно написать игру - угадай число [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

184
React. Ожидание ответа от сервера

React. Ожидание ответа от сервера

У меня есть компонент User, который рендерит компоненты UserAuth и UserProfileКомпонент User хранит access_token, который получает из UserAuth

144