Циклический сдвиг числа влево,битово
Необходимо сделать циклический сдвиг влево двоичного кода на 1 позицию, то есть число 130:10000010 будут переведены в 5: 00000101, я код написал но не понимаю почему он не работает, если не сложно прошу объяснить почему мой код не работает и что я могу исправить, сделать на C без дополнительных библиотек кроме iostream.
int n, nMask; //Создаётся первым число,2 маска числа
cin >> n;
nMask = n; //Копирую в маску
int pos = 31; //Нахожу позицию элемента с право который нужно переключить на 1
bool show = false; //Помогает не искать после нахождения старшего бита
for (int i = 31; i >= 0; i--) {
if (n >> i & 1 && show) {
show = true; //Этот if станет неактивным после того как show станет true
pos -= i; //Убираю от позиций шаги которые пришлось проделать и получаю бит который нужно переключить
}
}
nMask ^= 1 << pos; //Изменяю определённый элемент бита на 1
n = n | ~nMask; //Копирую изменённую маску с переключёнными битами если он встретит 0 и 1 то он включит его на 1
cout << (int)n; //Вывод нового числа
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ваш код сложен, непонятно, что вы пытаетесь делать. Так, как мне кажется, проще:
unsigned int rol(unsigned int x, unsigned int n)
{
n %= 32;
return (x << n) | (x >> (32-n));
}
unsigned char rol(unsigned char x, unsigned int n)
{
n %= 8;
return (x << n) | (x >> (8-n));
}
Пожалуй, можно даже так:
template<typename T,
typename = std::enable_if_t<std::is_integral_v<T>>>
T rol(T x, unsigned int n)
{
using unsigT = typename std::make_unsigned<T>::type;
unsigT y = x;
n %= sizeof(T)*CHAR_BIT;
return (y << n) | (y >> (sizeof(T)*CHAR_BIT-n));
}