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

 
Перевод из десятичной в двоичную сист., Как сделать?
Chillout
Отправлено: 19.02.2007, 20:00


Ученик-кочегар

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



Здравствуйте! У кого-нибудь есть примерчик как перевести десятичное число в двоичную систему счисления (вроде задачка неоригинальная)? Заранее благодарен.
Grigoriy
Отправлено: 19.02.2007, 20:35


Мастер участка

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



Только Edit2 подлиннее сделай, чтобы все 32 знака видно было.

CODE

TForm1 *Form1;
//Функция переводит строку с числом в десятичном представлении (src)
//в строку с числом в двоичном представлении (dest)
//Обе строки нуль-терминальные
void StrDecToStrBin(char* dest, char* src);
void StrDecToStrBin(char* dest, char* src)
{
int a;
a=StrToIntDef(src,0);
asm
{
mov eax,'0000';//загрузим начальный шаблон
cld;//цепочечные операции по возрастанию адреса
mov ecx,8;//количество двойных слов = 32/4
mov edi,dest;//адрес получаемой строки
rep stosd;//сохраним сначала строку из одних нулей
mov eax,a;//теперь используем число исходное
mov edi,dest;//опять настроим на начало получаемой строки
mov ecx,32;//количество байтов-символов
//В регистрах процессора числа хранятся в двоичном виде
@c1:rcl eax,1;//циклический сдвиг двойного слова через флаг переноса
//бывший старший байт оказывается во флаге CF
adc byte ptr [edi],0;//используем инструкцию сложения с флагом переноса
inc edi;//адрес на следующий символ
loop @c1;//цикл снова
};
};

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString g;
g.SetLength(32);
StrDecToStrBin(g.c_str(),Edit2->Text.c_str());
Edit1->Text=g;
}


Все. Вот такая моя реализация, в общем...
Chillout
Отправлено: 19.02.2007, 23:45


Ученик-кочегар

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



Большое спасибо, ща будем пробывать....
kolyamba
Отправлено: 20.02.2007, 11:33


Ученик-кочегар

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



В можно ли то же самое реализовать, используя просто деление (на 2) через цикл?
Нужно целое число.
AVC
Отправлено: 20.02.2007, 12:49


Ветеран

Группа: Модератор
Сообщений: 1583



Сдвиги выгоднее деления.
Вход — 32 разрядное целое
Выход — массив 0 и 1
CODE

__int32 content = ...;
int K[sizeof(content)*8];
for (int i(0); i < (sizeof(K)/sizeof(K[0])); i++)
  K[i] = (content >> i) & 0x01;


или в обратном порядке бит
CODE

__int32 content = ...;
int K[sizeof(content)*8];
for (int i(0), n(0); i < sizeof(content); i++)
  for (int j=0x80; j; j >>= 1)
      K[n++] = (content & (j << i*8))? 1 : 0;


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