Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

Перевод из двоичной в десятичную   Найти похожие ветки 

 
Sphinxx ©   (2005-02-10 19:53) [0]

Подскажите плиз функцию перевода из двоичной системы в десятиричную и обратно...
При чем двоичное число - это строка


 
Kerk ©   (2005-02-10 20:02) [1]

а подумать?


 
Fay ©   (2005-02-10 20:20) [2]

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;


 
Anatoly Podgoretsky ©   (2005-02-10 20:30) [3]

Понятие двоичная требует уточнения, у кого то это бинарная, а у кого то текстовая, у тебя какая?

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:41) [4]

2 Anatoly Podgoretsky ©   (10.02.05 20:30) [3]
1) Проверки я не ставил сознательно - лениво.
2) Результат не противоречит вопросу, т.к. "При чем двоичное число - это строка".
 Предположив, что это отличает его ("двоичное число") от результата
 я сделал вывод, что результат - число.
3) >> Некрасиво, хоть и допустимл
  В смысле?


 
Fay ©   (2005-02-10 20:43) [5]

Правда, вместо
+ (Byte(s[i]) - $30)
надо бы
or (Byte(s[i]) - $30)


 
Anatoly Podgoretsky ©   (2005-02-10 20:55) [6]

Fay ©   (10.02.05 20:41) [4]
Так я и осталяю это ему как работу на дом, что бы он знал что изменить.

or (Byte(s[i]) - $30)
Без разницы как для правильных данных, так и неправильных, представь в строке код A


 
Anatoly Podgoretsky ©   (2005-02-10 20:57) [7]

Вот если написать (Byte(s[i]) and 1) то последстия могут быть менее катастрофические, но такие же бессмысленные.


 
Sphinxx ©   (2005-02-10 21:10) [8]

Большое всем СПАСИБО


 
Fay ©   (2005-02-10 21:13) [9]

2 Anatoly Podgoretsky ©   (10.02.05 20:57) [7]
>> (Byte(s[i]) and 1)
and ?!


 
begin...end ©   (2005-02-10 21:18) [10]

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.


 
begin...end ©   (2005-02-10 21:25) [11]

> Fay ©   (10.02.05 21:13) [9]

По-видимому, имелось в виду следующее. Если предполагать, что в строке нет ничего, кроме символов нулей и единиц, то у одного из этих символов ("0") будет чётный код, а у другого ("1") - нечётный. Это и проверяется путём операции and 1.


 
Anatoly Podgoretsky ©   (2005-02-10 21:45) [12]

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


 
Sphinxx ©   (2005-02-11 21:52) [13]

Большое спасибо!
А как насчет перевода обратно в двоичную (в строку)?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
1-1108105435
Zloy
2005-02-11 10:03
2005.02.27
Удаление иконки с трея


4-1105502141
TankMan
2005-01-12 06:55
2005.02.27
Как определить Vendor-а чипсета материнской платы без WMI?


3-1107136265
mlitkin
2005-01-31 04:51
2005.02.27
Как узнать была ли изменена база?


14-1107986009
Мазут Береговой
2005-02-10 00:53
2005.02.27
Всем читать и смеяться до слёз.. в свободное время..


9-1102065795
lifo
2004-12-03 12:23
2005.02.27
Спрайт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский