Побитовые операции в Си
Есть задача, на побитовые операции. Условия задачи: Удалить цифру 1 в записи данного восьмеричного числа. Не до конца понимаю, как это реализовать при помощи побитовых операций. Например число 213 превратиться в 23
Ответы (2 шт):
Автор решения: HolyBlackCat
→ Ссылка
x & 7 - младшая цифра числа, например 123 -> 3.
x >> 3 - число без младшей цифры, например 123 -> 12.
x << 3 - добавляет ноль справа, например 123 -> 1230
(x << 3) | y - добавляет произольную цифру справа, например 123, 4 -> 1234.
Дальше сами.
Автор решения: Сергей Симонов
→ Ссылка
Разряд восьмеричного числа занимает 3 бита. Достаточно пройтись по разрядам числа со вставкой в результат всех цифр, кроме 1.
Пример реализации:
#include <cstdlib>
unsigned int skip_ones_in_oct(unsigned int x){
unsigned int res=0;
int i=0; // счетчик разрядов выходного чиcла
while (x>0){
std::div_t qr = div(x, 8); // получаем делитель и остаток
if (qr.rem != 1){ // остаток rem - это последняя цифра восьмиричного числа
res = res +(qr.rem << 3*i); // добавляем цифру в очередной разряд
i++; // увеличиваем разряд
}
x = qr.quot; // убираем младший разряд исходного числа
}
return res;
}