Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Матчасть кодирование в двоичную ситему счисления


Автор: ErManDir 7.9.2006, 14:45
Извиняюсь за глупый вопрос, но что-то инет мне на этот раз не помог, а в хелпе я что-то нифига не разобрался.
В общем задача такая:
Мне надо составить двоичное число из трех знаков, типа 000 или 010, потом его сконвертнуть в десятиричное и сохранить в базе, ну потом, естественно опять из 10-ти в 2-х и разобрать на биты. Как это сделать?

Наверняка двоичную переменную прийдется таскать через string, хотя не уверен. В общем, помогите плиз!

Автор: Yanis 7.9.2006, 14:49
http://forum.vingrad.ru/index.php?showtopic=17463
http://forum.vingrad.ru/index.php?showtopic=37659&view=all

Добавлено @ 14:49 
ErManDir
Внизу страницы ещё ссылки.

Автор: ErManDir 7.9.2006, 15:16
Спасибо за ссылки, но ответьте пожалуйста на вопрос: А встроенных инструментов разве не существует?

Автор: Yanis 7.9.2006, 15:26
Цитата(ErManDir @  7.9.2006,  16:16 Найти цитируемый пост)
А встроенных инструментов разве не существует? 

Какие ещё инструменты? Есть calc.exe smile 
Есть стандартный класс TBits. Можно заморочиться и написать наследника TByte с нужными функциями.

Автор: ErManDir 7.9.2006, 15:52
Да про TBits я как раз и не понял. Хотя он вроде для того и сушествует.

И насчет ссылок. Вторая ссылка утверждает, что:

100101

нумеруем его с хвоста начиная с нуля т.е.

5 4 3 2 1 0
|_|_|_|_|_|
1 0 0 1 0 1

теперь каждую двоичную цифру умножаем на 2 возводим в степень = нумерации и складываем т.е.

(2*1)^5+(2*0)^4+(2*0)^3+(2*1)^2+(2*0)^1+(2*1)^0=
32+0+0+4+0+1=37


Но это неправильно...

Правильно будет:
1*(2^5)+0*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0)=32+0+0+4+0+1=37

любое число в степени ноль всегда 1. Так что двоичное число 000, будет как 0+0+1=1, а это не правильно.

Автор: Yanis 7.9.2006, 16:10
Если нужно именно для числе не больше 7, то можно так:
Код
TBinaryNum = array[0..2] of char;

function DecToBin(Num: Byte): TBinaryNum;
var
  i, l: byte;
begin
  Result := '000';
  if Num > 7 then Exit;

  l := High(Result);
  for i := 0 to l do
    Result[i] := IntToStr(Byte((Num and (1 shl (l - i))) > 0))[1];
end;


Добавлено @ 16:18 
Код
function BinToDec(Bits: TBinaryNum): Byte;
var
  i, l: Integer;
begin
  Result := 0;
  l := High(Bits);

  for i := 0 to l do
    if Bits[i] = '1' then Result := Result or (1 shl (l - i))
    else Result := Result and not (1 shl (l - i));
end;

Автор: ErManDir 8.9.2006, 04:02
Спасибо за пример с TBits. Завтра посмотрю его повнимательнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)