Как перевести числа в двоичную систему счисления

Представление чисел в двоичной системе

Рассмотрим обычное десятичное число, например, 5 623. Интуитивно понятно, что означают все эти цифры: (5 * 1000) (6 * 100) (2 * 10) (3 * 1). Так как в десятичной системе счисления всего 10 цифр, то каждое значение умножается на множитель 10 в степени n. Выражение выше можно записать ещё следующим образом: (5 * 103) (6 * 102) (2 * 101) (3 * 1).

Двоичные числа работают по аналогичной схеме, за исключением того, что в системе всего 2 числа (0 и 1) и множитель не 10, а 2. Так же как запятые (или пробелы) используются для улучшения читабельности больших десятичных чисел (например: 1, 427, 435), двоичные числа пишутся группами (в каждой по 4 цифры). Например: 1101 0101.

Десятичное значение Двоичное значение
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111

Примеры перевода чисел из двоичной системы в десятичную

117 / 2 = 58 r158 / 2 = 29 r029 / 2 = 14 r114 / 2 = 7 r07 / 2 = 3 r13 / 2 = 1 r11 / 2 = 0 r1

117 (десятичное) = 111 0101 (двоичное)

Наибольшее число, умноженное на 2, но которое меньше 117 — это 64.

117 >= 64? Да, поэтому 64-ый бит равен 1. 117 − 64 = 53.53 >= 32? Да, поэтому 32-ой бит равен 1. 53 − 32 = 21.21 >= 16? Да, поэтому 16-ый бит равен 1. 21 − 16 = 5.

5 >= 8? Нет, поэтому 8-ой бит равен 0.5 >= 4? Да, поэтому 4-ый бит равен 1. 5 − 4 = 1.1 >= 2? Нет, поэтому 2-ой бит равен 0.1 >= 1? Да, поэтому 1-ый бит равен 1.

Результат:

  1. Пронумеровать разряды двоичного числа справа налево, начиная с нуля.
  2. Умножить каждый ненулевой разряд на 2 в степени его номера и сложить результаты.

Пример 1:

Перевести число 1111001102 из двоичной системы в десятичную.

Решение:

Нумеруем разряды числа справа налево, начиная с нуля:

И вычисляем результат:

1111001102 = 1 ⋅ 28 1 ⋅ 27 1 ⋅ 26 1 ⋅ 25 1 ⋅ 22 1 ⋅ 21 = 256 128 64 32 4 2 = 48610

Пример 2:

Перевести число 1010001112 из двоичной системы в десятичную.

Решение:

Нумеруем разряды числа справа налево:

И вычисляем результат:

1010001112 = 1 ⋅ 28 1 ⋅ 26 1 ⋅ 22 1 ⋅ 21 1 ⋅ 2 = 256 64 4 2 1 = 32710

Способ №2: Конвертация чисел из десятичной системы в двоичную

Первый способ конвертации чисел из десятичной системы счисления в двоичную заключается в непрерывном делении числа на 2 и записывании остатков. Если остаток («r» от англ. «remainder») есть, то пишем 1, если нет, то пишем 0. Затем, читая остатки снизу-вверх, мы получим готовое двоичное число.

148 / 2 = 74 r074 / 2 = 37 r037 / 2 = 18 r118 / 2 = 9 r09 / 2 = 4 r14 / 2 = 2 r02 / 2 = 1 r01 / 2 = 0 r1

Записываем остатки снизу-вверх: 1001 0100.

148 (десятичное) = 1001 0100 (двоичное)

(1 * 128) (0 * 64) (0 * 32) (1 * 16) (0 * 8) (1 * 4) (0 * 2) (0 * 1) = 148

Этот способ хорошо подходит для небольших двоичных чисел. Рассмотрим десятичное 148 ещё раз. Какое наибольшее число, умноженное на 2 (из ряда: 1, 2, 4, 8, 16, 32, 64, 128, 256 и т.д.), меньше 148? Ответ: 128.

148 >= 128? Да, поэтому 128-ой бит равен 1. 148 − 128 = 2020 >= 64? Нет, поэтому 64-ый бит равен 0.20 >= 32? Нет, поэтому 32-ой бит равен 0.

Предлагаем ознакомиться:  Как избавиться от запаха пота в обуви

20 >= 16? Да, поэтому 16-ый бит равен 1. 20 − 16 = 44 >= 8? Нет, поэтому 8-ой бит равен 0.4 >= 4? Да, поэтому 4-ый бит равен 1. 4 − 4 = 0, что означает, что все остальные биты равны 0.

Примечание: Если ответом является «Да», то мы имеем true, что означает 1. Если ответом является «Нет», то мы имеем false, что означает 0. Детальнее об этом в уроке №34.

148 = (1 * 128) (0 * 64) (0 * 32) (1 * 16) (0 * 8) (1 * 4) (0 * 2) (0 * 1) = 1001 0100

Двоичный символ 1 1 1
* Значение символа 128 64 32 16 8 4 2 1
= Результат (148) 128 16 4

Сложение двоичных чисел

В некоторых случаях (один из них мы рассмотрим ниже) вам может понадобиться выполнить сложение двух двоичных чисел. Это на удивление легко (может быть даже проще, чем сложение десятичных чисел), хотя поначалу это может показаться немного странным, но вы быстро к этому привыкните.

0110 (6 в десятичной системе) 0111 (7 в десятичной системе)

   0 0 = 0

   0 1 = 1

   1 0 = 1

   1 1 = 0, 1 переносим в следующую колонку

0110 (6 в десятичной системе) 0111 (7 в десятичной системе)—-    1

0 1 = 1. Легко.

 10110 (6 в десятичной системе) 0111 (7 в десятичной системе)—-  01

1 1 = 0, 1 остаётся в памяти до следующей колонки.

110110 (6 в десятичной системе) 0111 (7 в десятичной системе)—- 101

А вот здесь уже немного сложнее. Обычно 1 1 = 0 и остаётся единица, которую мы переносим в следующую колонку. Тем не менее, у нас уже есть 1 из предыдущего столбца и нам нужно добавить ещё 1. Что делать? А вот что: 1 остаётся, а ещё 1 мы переносим дальше.

110110 (6 в десятичной системе) 0111 (7 в десятичной системе)—-1101

0 0 = 0, но так как есть ещё 1, то результат: 1101.

13 (десятичное) = 1101 (двоичное)

       1 (переносим в следующую колонку)1011 0011 (двоичное число)0000 0001 (1 в двоичной системе)———1011 0100

Числа signed и метод «two’s complement»

В примерах выше мы работали только с целыми числами unsigned, которые могут быть только положительными. Сейчас же мы рассмотрим то, как работать с числами signed, которые могут быть как положительными, так и отрицательными.

С целыми числами signed используется метод «two’s complement». Он означает, что самый левый (самый главный) бит используется в качестве знакового бита. Если значением знакового бита является 0, то число положительное, если 1, то число отрицательное.

Сначала выясняем бинарное представление 5: 0000 0101Затем инвертируем все биты (конвертируем в противоположные): 1111 1010Затем добавляем к числу единицу: 1111 1011

Представление положительного 76: 0100 1100Инвертируем все биты: 1011 0011Добавляем к числу единицу: 1011 0100

Почему мы добавляем единицу? Рассмотрим это на примере 0 (нуля). Если противоположностью отрицательного числа является его положительная форма, то 0 имеет два представления: 0000 0000 (положительный ноль) и 1111 1111 (отрицательный ноль). При добавлении единицы, в 1111 1111 произойдёт переполнение, и значение изменится на 0000 0000.

Перед тем, как конвертировать двоичное число (используя метод «two’s complement») обратно в десятичную систему счисления, нужно сначала посмотреть на знаковый бит. Если им является 0, то смело используйте способы выше для целых чисел unsigned. Если же знаковым битом является 1, то тогда нужно инвертировать все биты, затем добавить единицу, затем конвертировать в десятичную систему, и уже после этого менять знак десятичного числа на отрицательный (потому что знаковый бит изначально был отрицательным).

Предлагаем ознакомиться:  Вибрация двигателя на холостых оборотах передается на кузов: причины, что делать?

Имеем: 1001 1110Инвертируем биты: 0110 0001Добавляем единицу: 0110 0010Конвертируем в десятичную систему счисления: (0 * 128) (1 * 64) (1 * 32) (0 * 16) (0 * 8) (0 * 4) (1 * 2) (0 * 1 ) = 64 32 2 = 98

Так как исходный знаковый бит был отрицательным, то результатом является -98.

Почему важен тип данных?

Рассмотрим двоичное число 1011 0100. Что это за число в десятичной системе счисления? Вы, наверное, подумаете, что это 180, и, если бы это было стандартное двоичное число unsigned, то вы были бы правы. Однако, если здесь используется метод «two’s complement», то результат будет другой: -76. Также значение ещё может быть другое, если оно закодировано каким-то третьим способом.

Так как же C понимает в какое число конвертировать 1011 0100: в 180 или в -76?

Ещё в уроке №28 мы говорили: «Когда вы указываете тип данных переменной, компилятор и процессор заботятся о деталях кодирования этого значения в соответствующую последовательность битов определённого типа данных. Когда вы просите ваше значение обратно, то оно «восстанавливается» из соответствующей последовательности битов в памяти».

Тип переменной используется для конвертации бинарного представления числа обратно в ожидаемую форму. Так что, если вы указали целочисленный тип данных unsigned, то компилятор знает, что 1011 0100 — это стандартное двоичное число, а его представление в десятичной системе счисления — 180. Если же типом переменной является целочисленный тип signed, то компилятор знает, что 1011 0100 закодирован с помощью метода «two’s complement» и его представлением в десятичной системе счисления является число -76.

Тест

1. Конвертируйте двоичное 0100 1101 в десятичную систему счисления.

2. Конвертируйте десятичное 93 в 8-битное двоичное число unsigned.

3. Конвертируйте десятичное -93 в 8-битное двоичное число signed (используя метод «two’s complement»).

4. Конвертируйте двоичное 1010 0010 в десятичное unsigned.

5. Конвертируйте двоичное 1010 0010 в десятичное signed (используя метод «two’s complement»).

6. Напишите программу, которая просит пользователя ввести число от 0 до 255. Выведите его как 8-битное двоичное число (в парах по 4 цифры). Не используйте побитовые операторы.

Подсказка №1: Воспользуйтесь способом конвертации №2. Предполагается, что наименьшее число для сравнения — 128.

Подсказка №2: Напишите функцию для проверки входных чисел: являются ли они больше чисел, умноженных на 2 (т.е. 1, 2, 4, 8, 16, 32, 64 и 128). Если это так, то выводится 1, если нет, то выводится 0.

Ответы

Ответ №1

Ответ №2

Используя способ №1:

93 / 2 = 46 r1
46 / 2 = 23 r0
23 / 2 = 11 r1
11 / 2 = 5 r1
5 / 2 = 2 r1
2 / 2 = 1 r0
1 / 2 = 0 r1

Остатки снизу-вверх: 101 1101.

Используя способ №2:

Наибольшее число, умноженное на 2, но которое меньше 93 — это 64.

93 >= 64? Да, 64 бит равен 1. 93 - 64 = 29.
29 >= 32? Нет, 32 бит равен 0.
29 >= 16? Да, 16 бит равен 1. 29 - 16 = 13.
13 >= 8? Да, 8 бит равен 1. 13 - 8 = 5.
5 >= 4? Да, 4 бит равен 1. 5 - 4 = 1.
1 >= 2? Нет, 2 бит равен 0.
1 >= 1? Да, 1 бит равен 1.

Ответ: 0101 1101.

Ответ №3

Мы уже знаем из предыдущего примера, что 93 — это 0101 1101
Поэтому инвертируем биты: 1010 0010
И добавляем единицу: 1010 0011

Ответ: 1010 0011.

Ответ №4

Работая справа налево:

1010 0010 = (0 * 1) (1 * 2) (0 * 4) (0 * 8) (0 * 16) (1 * 32) (0 * 64) (1 * 128) = 2 32 128 = 162

Ответ: 162.

Ответ №5

Имеем: 1010 0010
Инвертируем биты: 0101 1101
Добавляем единицу: 0101 1110
Конвертируем в десятичную систему счисления: 16 64 8 4 2 = 94

Так как здесь используется метод «two’s complement», а знаковый бит является отрицательным, то результат: -94

Ответ: -94.

Ответ №6

Загрузка ...
Adblock detector