Вводится знаковое целое длинное число(32 бита) А. Необходимо циклически сдвинуть А вправо на n бит

107
07 июня 2019, 02:10

Нашёл программу выполняющую условие моей задачи. Нужно организовать ввод самого числа А и ввод числа n. Ко всему этому мне подсказали недостаток данной программы. она выполняет действия в битовом типе данных,а необходимо использовать int.

include <iostream>
include <bitset>
using namespace std;
const unsigned int BYTE = 10; // количество разрядов
const unsigned int STEP = 2;  // на сколько шагов нужно будет сдвинуть
int main() {
    bitset<BYTE> bit(106), part1, part2, result;
    cout << "bit\t" << bit << endl; // исходное число
    // результат будет составлен из двух частей
    part1 = bit >> STEP; // первая часть, два сдвига вправо
    cout << "part1\t" << part1 << endl;
    part2 = bit << BYTE - STEP; // вторая часть, восемь сдвигов влево (десять разрядов числа минус два шага)
    cout << "part2\t" << part2 << endl;
    result = part1 | part2; // объеденияем части
    cout << "result\t" << result << endl; // результат объединения частей
    system("pause");

}

Предполагаю,что нужно заменить эту часть на ввод данных в main.

const unsigned int BYTE = 10; // количество разрядов
const unsigned int STEP = 2;  // на сколько шагов нужно будет сдвинуть

И не использовать ничего кроме include <iostream>. нельзя использовать include <bitset> и include <limits.h>

Answer 1

Думаю, вы уже сами нашли решение.

На всякий случай, для типа данных long, программа вместе с вводом и проверками может выглядеть как-то так:

#include <iostream>
#include <limits.h>
using namespace std;
int main () {
  cout << "Rotate long `a` rigth, enter value of `a` and shift:\n";
  long a, n;
  size_t nb = sizeof(a) * CHAR_BIT;
  cout << "long a is " << nb << " bits long\n";
  while (cin >> a >> n) {
    if (n > -1 && n < nb) {
      cout << "a = " << dec << a << " 0x" << hex << a << '\n';
      // это собственно вращение
      // cast к unsigned необходим, чтобы при сдвиге влево знаковый разряд не распространялся
      a = (((unsigned long)a) >> n) | (a << (nb - n));
      cout << "after rotr a = " << dec << a << " 0x" << hex << a << '\n';
    } else
      cout << "wrong shift value " << n << '\n';
  }
}
READ ALSO
Обработка нажатия комбинации клавиш

Обработка нажатия комбинации клавиш

Как сделать обработку нажатия комбинации клавиш (например ctrl + n), что-бы после этого выполнялось какое-то действие?

142
Где ошибся с функцией Insert?

Где ошибся с функцией Insert?

Задача для этой части кода: Если получаемое число меньше первого в векторе, то нужно это число вставить на первое место в векторе, а остальное...

139
MS MPI неправильные данные при Send struct

MS MPI неправильные данные при Send struct

Я объявил кастомную структуру для использования в send/recv

116
Вызов деструктора для объекта в его методе

Вызов деструктора для объекта в его методе

Насколько безопасна такая вещь:

128