Вы хотите конвертировать из базы 10 в базу 8. Самый простой способ сделать это - думать в двоичной базе 2. Предположим, вы вводите число, которое будет храниться переменной. Скорее всего, вы вводите это число в Base 10, однако, когда вы пытаетесь использовать побитовые операторы по сохраненному значению, он будет обрабатывать номер, как если бы он был базой 2. Это изображение объясняет преобразование от основания 2 к основанию 10. This image explains converting from base 2 to base 10.
Обратите внимание на первые три бита, они эквивалентны 1, 2 и 4, включая 0, это означает, что эти первые три цифры могут представлять 8 разных чисел. Другими словами, каждые три цифры в двоичном выражении представляют одну цифру в восьмеричном. Это означает, что первые три из десятичной точки - это ваша первая восьмеричная цифра, а вторая - вторая и т. Д. И так далее. В качестве примера 71 в двоичном выражении 1000111 (или 64 + 8 + 4 + 2 + 1), расщепляющее это на секции из трех, дает 111 в двоичном или 7 для одного места, 000 в двоичном или 0 для десятков мест, а 001 в двоичный или 1 в десятичной форме для сотен мест нашего восьмеричного числа. Таким образом, 71 в десятичном значении будет равен 107.
Кодексом вам нужно будет использовать побитовые операторы для создания временного значения, равного первым 3 цифрам номера. Значение этого временного значения будет находиться в месте, соответствующем тому, сколько раз вы выполняли операцию (первый раз синглы, второй раз десятки и т. Д.), Тогда вы захотите сдвинуть значение вправо на три места.
Однако, предполагая, что ваша кодировка в c, если все, что вы хотите сделать, это распечатать номер в восьмеричном, возьмите свой номер и используйте% o вместо% i в функции printf.
Если вы собираетесь использовать побитовые операторы, легче думать о числах в двоичном формате, а не о десятичном значении - в этом случае восьмеричные числа могут быть представлены 3 битами, N & 7 (00000111) получит наименее значимое восьмеричное значение, а из там вы можете сдвинуть вправо на 3 и 7 так далее и т. д. – Enfyve