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;
|
|
|