![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевод из двоичной в десятичную
Sphinxx © (2005-02-10 19:53:00)Подскажите плиз функцию перевода из двоичной системы в десятиричную и обратно...
При чем двоичное число - это строка
Sphinxx (2005-02-11 21:52:00) [1]Большое спасибо!
А как насчет перевода обратно в двоичную (в строку)?
Anatoly Podgoretsky (2005-02-10 21:45:00) [2]Fay © (10.02.05 21:13) [9]
and 1 выделяется младший бит
Result := (Result shl 1) or (Byte(s[i]) and 1)
выделяем бит и устанавливаем его в результат, предварительно сдвинув результат на один бит влево. Вся конструкция чисто булевская. Остается обеспечить только правильность s[i].
Пособие по работе с битами здесь
http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.html
begin...end (2005-02-10 21:25:00) [3]> Fay © (10.02.05 21:13) [9]
По-видимому, имелось в виду следующее. Если предполагать, что в строке нет ничего, кроме символов нулей и единиц, то у одного из этих символов ('0') будет чётный код, а у другого ('1') - нечётный. Это и проверяется путём операции and 1.
begin...end (2005-02-10 21:18:00) [4]
function BinToDec(const Value: String): Cardinal;
var
I, L: Integer;
begin
L := Length(Value);
Result := 0;
for I := 1 to L do
if Value[I] = '1' then
Inc(Result, 1 shl (L - I))
else if Value[I] <> '0' then
raise Exception.Create('Invalid symbol')
end.
Fay (2005-02-10 21:13:00) [5]2 Anatoly Podgoretsky © (10.02.05 20:57) [7]
>> (Byte(s[i]) and 1)
and ?!
Sphinxx (2005-02-10 21:10:00) [6]Большое всем СПАСИБО
Anatoly Podgoretsky (2005-02-10 20:57:00) [7]Вот если написать (Byte(s[i]) and 1) то последстия могут быть менее катастрофические, но такие же бессмысленные.
Anatoly Podgoretsky (2005-02-10 20:55:00) [8]Fay © (10.02.05 20:41) [4]
Так я и осталяю это ему как работу на дом, что бы он знал что изменить.
or (Byte(s[i]) - $30)
Без разницы как для правильных данных, так и неправильных, представь в строке код A
Fay (2005-02-10 20:43:00) [9]Правда, вместо
+ (Byte(s[i]) - $30)
надо бы
or (Byte(s[i]) - $30)
Fay (2005-02-10 20:41:00) [10]2 Anatoly Podgoretsky © (10.02.05 20:30) [3]
1) Проверки я не ставил сознательно - лениво.
2) Результат не противоречит вопросу, т.к. "При чем двоичное число - это строка".
Предположив, что это отличает его ("двоичное число") от результата
я сделал вывод, что результат - число.
3) >> Некрасиво, хоть и допустимл
В смысле?
Anatoly Podgoretsky (2005-02-10 20:30:00) [11]Понятие двоичная требует уточнения, у кого то это бинарная, а у кого то текстовая, у тебя какая?
Fay © (10.02.05 20:20) [2]
Некрасиво, хоть и допустимл
Result := (Result shl 1) + (Byte(s[i]) - $30);
Поскольку источник ошибки, тут не место для оптимизации, надо написать просто в лоб
if s[I] = 0 then
else s[I] = 1 then
else
Ну и результат должен быть строкой десятичных цифр, иначе противоречит вопросу. Ну это домашнее задание для автора.
Другой недостаток, нет проверки на допустимость, входная строка должна быть точно равна или менее 32 двоичным цифрам, стоит проверить на допустимость и разрядность повысить до Int64. Это тоже домашнее задание для автора.
Fay (2005-02-10 20:20:00) [12]
function BinStrtoInt(s : string) : Integer;
var
i, n : Integer;
begin
Result := 0;
n := Length(s);
i := 0;
while i < n do
begin
Inc(i);
Result := (Result shl 1) + (Byte(s[i]) - $30);
end;
end;
Kerk (2005-02-10 20:02:00) [13]а подумать?