Перевод чисел в двоичную систему счисления

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

1) При переводе целых чисел мы делим на два, биты выталкиваются за разрядную сетку справа от точки.
2) При переводе дробных чисел мы умножаем на два, биты выталкиваются за разрядную сетку слева от точки.

Перевод целых чисел в двоичную систему счисления

Неформальный алгоритм перевода чисел в двоичную форму выглядит следующим образом:

Пусть D у нас целое число, записанное в десятичной системе счисления, например, 
`D = 825`
Запишем его, как `D_0 = 825`
Если число четное, то последний бит равен нулю, если нечетное, то 1.
В данном случае `D_0 = 825` - нечетное число, `b_0 = 1`
Делим D_0 пополам, отбрасывая остаток: 
`D_1 = D_0/2 = 825/2 = 412`
412 - четное число, и применяя то же самое правило, получим `b_1 = 0` 
Записываем его слева от предыдущей единицы: `01`
Далее аналогично:
`D_2 = D_1/2 = 412/2 = 206 -> b_2 = 0` (значит, вся строка заканчивается на `001`)
`D_3 = D_2/2 = 206/2 = 103 -> b_3 = 1` (значит, вся строка заканчивается на `1001`)
`D_4 = D_3/2 = 103/2 = 51 -> b_4 = 1` (значит, вся строка заканчивается на `1 1001`)
`D_5 = D_4/2 = 51/2 = 25 -> b_5 = 1` (значит, вся строка заканчивается на `11 1001`)
`D_6 = D_5/2 = 25/2 = 12 -> b_6 = 0` (значит, вся строка заканчивается на `011 1001`)
`D_7 = D_6/2 = 12/2 = 6 -> b_7 = 0` (значит, вся строка заканчивается на `0011 1001`)
`D_8 = D_7/2 = 6/2 = 3 -> b_8 = 1` (значит, вся строка заканчивается на `1 0011 1001`)
`D_9 = D_8/2 = 3/2 = 1 -> b_9 = 1` (значит, вся строка заканчивается на `11 0011 1001`)
`D_10 = D_9/2 = 1/2 = 0 -> b_10 = 0` (значит, вся строка заканчивается на `011 0011 1001`)
Из нулей мы далее получим только нули, поэтому логично здесь и остановиться. 
Отбрасывая ведущие нули слева, получаем `D = 825_10 = 11 0011 1001_2`

 

Более формально это можно записать так:


dec - целое число
bin = \'\' - двоичная строка

1.	do{
2.		b_i = dec & 1;
3.		bin = concat(b_i, bin);
4.		dec = dec / 2;
5.	}while(dec > 0);

 

Перевод дробей в двоичную систему счисления

 

Пусть d у нас десятичная дробь от нуля до единицы, например, `d = 0.875`
`d_1 = 0.875`
Рассмотрим величину `R_1 = 2 * d_1 = 1.75`
Если `R_i >= 1.0`, то `b_(-i) = 1`, `R_i = R_i - 1` иначе `b_(-i) = 0`
`R_1 = 1.75 > 1.0 -> b_(-1) = 1`, `R_1 = 1.75 - 1.0 = 0.75`

`R_2 = 2 * R_1 = 1.5`
`R_2 = 1.5 > 1.0 -> b_(-2) = 1`, `R_2 = 1.5 - 1.0 = 0.5`

`R_3 = 2 * R_2 = 1.0`
`R_3 = 1.0 = 1.0 -> b_(-3) = 1`, `R_3 = 1.0 - 1.0 = 0`
Конец. 
Таким образом, `d = 0.875_10 = 0.111_2`

 

В данном случае нам попалась хорошая дробь. Для ее точного представления понадобилось всего три двоичных разряда. В то же время важно понимать, что дроби представимые конечным числом разрядов в десятичной системе счисления могут быть бесконечными в двоичной. Такова например, дробь 0.1.