C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Полцарства и полконя за алгоритмы, ищу алгоритмы перевода в системы счислен
.piero
  Отправлено: 21.03.2004, 20:52


Дежурный стрелочник

Группа: Участник
Сообщений: 62



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

подайте, пожалуйста!! biggrin.gif

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'у уж ладно отдаю полконя biggrin.gif

Вернуться в Вопросы программирования в C++Builder