2017-01-29 3 views
0

Я не ищу здесь никаких кодов. Я сам напишу код, как только я пойму логику, как преобразовать десятичное число в восьмеричное с помощью побитовых операторов. Я знаю, что было бы намного проще использовать умножение/деление, но вместо этого я хочу использовать побитовые операторы.Побитовое преобразование десятичных чисел в октябрь

Отлично, если кто-то может помочь мне с логикой. (Нет умножений или делений)

+0

Если вы собираетесь использовать побитовые операторы, легче думать о числах в двоичном формате, а не о десятичном значении - в этом случае восьмеричные числа могут быть представлены 3 битами, N & 7 (00000111) получит наименее значимое восьмеричное значение, а из там вы можете сдвинуть вправо на 3 и 7 так далее и т. д. – Enfyve

ответ

1

Вы хотите конвертировать из базы 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.

Смежные вопросы