Побитовые операции в Си

Есть задача, на побитовые операции. Условия задачи: Удалить цифру 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;
}
→ Ссылка