Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2013, 16:29   #1
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Вопрос Конвертирование с десятичной в двоичную и наоборот

Доброго времени суток! Вот решил написать програму для шифрования(метод DES). Самим первым что нужно сделать это розобрать число Int64 на отдельные биты(и если битов не хватает нужно их дописать). Все хорошо получилось конвертировать с десятичной в двоичную. А вот наоборот никак.... Точнее вылетает ИС "invalid floating point operation" на последнем шаге, когда i=0
Код:
for i := 63 downto 0 do Result:=Result+input[i]*Trunc(Power(2, 64-i-1));
Ниже код обоих функций:
Код:
type TBit=0..1;
type TBits=array of TBit;
function Int64ToBits(const input:Int64):TBits;//перетворення 8-и байтів в послідовність бітов
var i:byte;
    bit:TBit;
    buf:Int64;
begin
  i:=0; SetLength(Result, 64); buf:=input;//встановлюємо замовчування
  while buf>0 do begin//конвертуємо з десятичної системи в двійкову
    bit:=buf mod 2; Result[i]:=bit; buf:=buf div 2;
    i:=i+1;
  end;
end;
function BitsToInt64(const input:TBits):Int64;//вот сдесь и наоборот
var i:byte;
begin
  for i := 63 downto 0 do Result:=Result+input[i]*Trunc(Power(2, 64-i-1));
end;

Последний раз редактировалось Stilet; 26.12.2013 в 16:45.
Khayzenberg вне форума Ответить с цитированием
Старый 26.12.2013, 16:55   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Опять же, под рукой нет паскаля, потому могу гнать, но может так:
Код:
function Int64ToBits(const input:Int64):TBits;//перетворення 8-и байтів в послідовність бітов
var i:byte;
    buf:Int64;
begin
  SetLength(Result, 64); buf:=input;//встановлюємо замовчування
  for i := Low(Result) to High(Result) do begin
    Result[i] := buf mod 2;
    buf := buf div 2;
  end;
end;
while buf>0 do begin - не стоит полагаться на обнуление массивов при инициализации. Плохой тон, знаете ли. Заполняйте массив до конца.

Код:
function BitsToInt64(const input:TBits):Int64;//вот сдесь и наоборот
var i:byte;
begin
  Result := 0;
  for i := High(input) downto Low(input) do
    Result := Result * 2 + input[i];
end;
Power - весьма плохое решение. Работаете с целыми числами, так и работайте с ними как с целыми.

Последний раз редактировалось Sibedir; 26.12.2013 в 17:06.
Sibedir вне форума Ответить с цитированием
Старый 27.12.2013, 17:46   #3
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Хорошо

Спасибо огромное! Всегда возникали проблемы с конвертированием чисел в разные системы счисления. Может кто-то знает хорошие статейки?
Спасибо еще раз)
Khayzenberg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод из десятичной системы в двоичную tiger-krv C# (си шарп) 4 26.01.2015 10:30
С. Преобразование из десятичной в двоичную, странная ошибка. jullietka Помощь студентам 3 20.11.2011 14:56
Перевод из десятичной в двоичную систему diflesh2008 Помощь студентам 12 31.12.2010 15:38
си++ перевод из десятичной системы в двоичную Bonne Помощь студентам 3 21.04.2010 21:18