.piero |
Отправлено: 21.03.2004, 20:52 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 62
|
ищу алгоритмы перевода в системы счисления из десятичной и обратно
подайте, пожалуйста!!
Be Linux... ...use Windows!
|
|
exp |
Отправлено: 22.03.2004, 01:51 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Ты так говоришь, будто их пруд пруди...
Вот методы:
X10->Y2
Пример
CODE |
223 (в десятичной) -> Y (в двоичной)
Число Делитель Частное Остаток
223 2 111 1 /\
111 2 55 1 |
55 2 27 1 |
27 2 13 1 |
13 2 6 1 |
6 2 3 0 |
3 2 1 _________1__|
|
Принцип:
Делим число Х на 2, получаем частное (111) и ост. (1), берем частное от предыдущего деления (111), делим опять и получаем остаток..........так до тех пор, пока частное не стание меньше делителя (т.е 0 или 1). Тогда записывают ответ в порядке, обратном порядку получения остатков, т.е сначала запишем последнее частное (1) потом последний остаток (1), предпоследний (0), короче в направлении стрелки.
223 (10) = 11011111 (2)
Это для перевода ЦЕЛЫХ чисел.
Перевод чисел с плавающей точкой, и <1
CODE |
Пример
Главный множитель * множитель = Целая часть . Дробная часть
0.37585 2 | 0 0.7517
0.7517 2 | 1 0.5034
0.5034 2 | 1 0.0068
0.0068 2 | 0 0.0136
0.0136 2 | 0 0.0272
0.0272 2 | 0 0.0544
0.0544 2 | 0 0.1088
0.1088 2 | 0 0.2176
0.2176 2 | 0 0.4352
0.4352 2 | 0 0.8704
0.8704 2 | 1 0.7408
0.7408 2 \/ 1 0.4816
|
В общем процесс это довольно интересный и увлекательный. Принцип, думаю, понятен. Берем число, умножаем на 2 , запоминаем целую часть ... дробную опять умножаем, и так до тех пор, пока не придет понимание того, что много знаков после запятой тебе в принципе и не нужны, ну либо пока дробная часть не станет равной 0. Число записывается в порядке получения единиц.
0.37585 (10) ~ 0.011000000011 (2).
Числа типа 2.718281828 колются этими двумя методами. Просто разбиваешь на 2 части целую и дробную и переводишь по отдельности . Потом склеиваешь результаты. (Вот этого, кстати, микрософтовский калькулятор делать не умеет)
Теперь преобразование Х(2) -> Y(10)
Ну здесь ваще проще паренной репы.
Есть число 101011100101101010.1011010001011010101
Давай переведем
CODE |
пронумеруем цифры так, чтоб нулевой была первая ДО запятой цифра.
17 12 10
|___ _| _|9876543210_____________________
101011100101101010.1011010001011010101
| | | |
13 11 -1 -19
|
Номера уменьшаются слева направо.
Теперь суммируем степени двойки с таким показателем, где стоит единица:
Y=2^17+2^15+2^13+2^12+2^11+2^8+2^6+2^5+2^3+2^1+2^-1+2^-3+2^-4+2^-6+2^-10+2^-12+2^-13+2^-15+2^-17+2^-19.
После неподолжительных подсчетов выяснилось, что
101011100101101010.1011010001011010101 (2) = 178538.7045 (10)
Вот и все.
Отредактировано exp — 22/03/2004, 02:55
|
|
Admin |
Отправлено: 22.03.2004, 20:25 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
А если практически, то
CODE |
AnsiString s;
int d = 1500; // число в десятичной
Label1->Caption = s.sprintf("%o", d); // в восьмеричной
Label2->Caption = s.sprintf("%X", d); // в шестнадцатиричной
//а теперь переведем в двоичную:
#include <bitset>
using namespace std;
bitset<32>bs;
bs = d; s = "";
for(int j=31; j>=0; j--){
if(bs.test(j)) s = s+'1'; else s = s+'0';
}
Label3->Caption = s; // в двоичной
|
|
|
exp |
Отправлено: 22.03.2004, 20:39 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
Ну а где мои полцарства? Ну а Admin'у уж ладно отдаю полконя
|
|
|