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


Автор: Akella 20.12.2004, 15:01
Подскажите, как представить число в двоичной системе исчисления и обратно

не смейтесь smile

Автор: Bes 20.12.2004, 15:30
Обратно куда?.... в десятичную. :-) Ща че-нить попробую наваять.

Так, вообщем чтобы из двоичной в десятичную перевести существует алгоритм. (кстати поищи в этом разделе - может там чего есть.)

например двоичное число

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
проверяем калькулятором =37 ч.т.д.
на счет обратно не помню, но подумаю.

Автор: кварк 20.12.2004, 15:42
Цитирую раздел FAQ DRKB (от себя советую его скачать ~15Mb):

Код

Для преобразования числа в двоичную запись удобно использовать функции shl и and.
Эта функция преобразует число в строку из единиц и нулей. Количество цифр определяется параметром Digits.


function IntToBin(Value: integer; Digits: integer): string;
var
 i: integer;
begin
 result := '';
 for i := 0 to Digits - 1 do begin
   if Value and (1 shl i) > 0
     then result := '1' + result
     else result := '0' + result;
 end;
end;
Вот пример использования этой функции:


procedure TForm1.Edit1Change(Sender: TObject);
begin
 Form1.Caption := IntToBin(StrToIntDef(Edit1.Text, 0), 128);
end;

Взято с сайта http://blackman.wp-club.net/

Автор: Bes 20.12.2004, 15:53
Ага, обратно так:
десятичное число делим все время на 2 до нуля и остаток записываем справа налево.
т.е.
37 делим на 2 = 18 и 1 ост =1
18 / 2 = 9 и 0 ост =01
9 / 2 = 4 и 0 ост =101
4 / 2 = 2 и 0 ост =0101
2/2 = 1 и 0 ост =00101
1/2 = 0 и 1 ост =100101

все 0

Автор: Akella 22.12.2004, 12:28
Цитата
Цитирую раздел FAQ DRKB (от себя советую его скачать ~15Mb):

Скачано сразу после появления, не волнуйся, а есть ли BinToInt
Спасибо за ответ, но меня еще волновал вопрос о том, как ручками (алгоритм), Bes помог.

и как перевести, например 16989,8956

Автор: _hunter 22.12.2004, 12:49
тут немного интереснее.
береш 0.8956 и умножаеш его на два:
1,79812
потом умножаеш на два результат ( после запятой ):
1,59624
и так до... ( пока не будет получен ноль или достигнута необходимая точность )

обратный перевод -- умножаеш 1 на 2 в степени -к ( при 0.8956 -- нулевая степень )

Автор: Akella 22.12.2004, 12:59
_hunter, объясни, пожалуйста подробнее, если можно, конечно
заранее благодарю
Добавлено @ 13:03
вот, что я нашел
http://forum.vingrad.ru/index.php?showtopic=3768&hl=Системы+исчисления

Автор: _hunter 22.12.2004, 13:12
а что именно объяснить ( кажись и так все понятно... )
может в аську стукни

Автор: Akella 22.12.2004, 13:23
объясните мне это
Например, число 0.625.
В двоичной системе 0.625=1*2^(-1)+0*2^(-2)+1*2^(-3)=101b * 2^(-1).
Первый бит отбрасываем, получаем 01b.
Экспонента будет равна -1+127=126.

Автор: _hunter 22.12.2004, 13:27
этого я тоже не понимаю smile
( есть подозрение что это пример перевода из двоичной в десятичную наоборот )

Автор: Bes 27.12.2004, 15:49
По моему чисел сточкой в двоичном представлении не бывает, а такие вещи как рил и экстендед хитрый механизм где для хранения дробной части отведены лишние байты.

Автор: Akella 27.12.2004, 17:36
Цитата
По моему чисел сточкой в двоичном представлении не бывает,


бывает

Автор: dm9 27.12.2004, 19:25
http://vestikinc.narod.ru/AB/

Автор: _hunter 27.12.2004, 20:18
бывают smile. причем я описывал алгоритм перевода.

Автор: Bes 28.12.2004, 09:21
2hunter: ну и я не увидел результата перевода в двоичном виде.

Автор: _hunter 28.12.2004, 12:11
Цитата
ну и я не увидел результата перевода в двоичном виде

в смысле? ( а что ты ожидал увидеть? )

Автор: dm9 28.12.2004, 12:26
Bes, посмотри мою ссылку. Там всё подробно расписано про дробные числа.

Автор: Bes 28.12.2004, 13:32
2dm9:
Ага, почитал. Ну вообщем понятно. т.е. с чисто мат-ой точки зрения просто ставим запятую - логично.

Автор: _hunter 28.12.2004, 13:41
запятая ставится не просто а хитро smile

Автор: Akella 28.12.2004, 13:42
что значит хитро?

Автор: _hunter 28.12.2004, 13:45
запятая поставленная просто -- это берем число после запятой за простой int и переводим его в bin
а поставленная хитро -- это перевод по 2 в отрицательной степени

Автор: Akella 30.12.2004, 09:59
короче переведи число 126,7 в двоичную систему счисления

Автор: _hunter 30.12.2004, 12:46
126, думаю, и сам переведеш, а 0,7:
010110011001

Автор: Akella 30.12.2004, 12:49
Цитата
126, думаю, и сам переведеш, а 0,7:
010110011001


я не просил результат, честно говоря, приведи пример, как говориться, на пальцах розложи, пожалуйста, очень прошу.

как будет полностью выглядеть запись? Она что, из двух частей будет состоять?

Автор: _hunter 30.12.2004, 17:36
Цитата
береш 0.8956 и умножаеш его на два:
1,79812
потом умножаеш на два результат ( после запятой ):
1,59624
и так до... ( пока не будет получен ноль или достигнута необходимая точность )

обратный перевод -- умножаеш 1 на 2 в степени -к ( при 0.8956 -- нулевая степень )

почему из двух?
число приводится к виду 0,ххх
т.е. 0,1267

Автор: Pathfider 30.12.2004, 22:28
Для перевода необходимо делить число на основание новой системы счисления, до тех пор, пока очередное частное от деления не станет меньше основания новой системы счисления. Тогда остатки от деления, записанные цифрами новой системы счисления в порядке , начиная с последнего , будут являться цифрами числа в новой СС.
Например:
173(10) в ?(2)
Код

173|_2
172   86|_2
  1   86    43|_2
       0    42   21|_2
             1   20   10|_2
                  1   10    5|_2
                       0    4    2|_2
                            1    2    1|_2
                                 0    0   0
                                      1

Затем собираем все цифры, начиная с последней:
10101101 - 173(2)
Наоборот, в двоичную:
1 0 1 0 1 1 0 1 - 173
7 6 5 4 3 2 1 0 - 1*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 173
Все очень просто.

Автор: _hunter 31.12.2004, 00:44
это для int' a. для float -- по-другому переводится

Автор: Bes 31.12.2004, 07:52
2_hunter: Балин, хантер, ты так от начала до конца и не показал ни одного примера давай 3.14 переведи полностью бес цитат, тем более, что с точки зрения программиста ис твоей цитаты следует, что если 0.8956 умножать на 2 то когда-нибудь получишь или 0 или "точность" большую исходного числа - хрень какая-то :-( по-подробнее пожалуйста - не понятно.
Видимо ты не раз это делал, но редко объяснял. :-)

Автор: _hunter 31.12.2004, 13:39
до конца -- это докуда?
и при чем тут умножение 0.8956? Алгоритм ведь не для одного числа писался ;) Попробуй, например, 0.5 на два поумножать smile
откуда вывод про "точность" большую исходного числа я так и не понял smile

объяснял, действительно, редко smile

ну а теперь сам перевод smile
приводим 3.14 к виду 0.314
0,314*2 = ,628 ( 2^-1 )
,628*2 = 1,256 ( 2^-2 )
,256*2= 0,512 ( 2^-3 )
,512*2 = 1,024 ( 2^-4 )
,024*2 = ,048 ( 2^-5 )
,048*2 = ,096 ( 2^-6 )
,096*2 = ,192 ( 2^-7 )
,192*2 = ,384 ( 2^-8 )
,384*2 = ,768 ( 2^-9 )
,768*2 = 1,536 ( 2^-10 )
и так до "пока не надоест" -- мне надоело smile
для обратного перевода считаем 2^-2 + 2^-4 + 2^-10
и получаем 0.313
епсилон = 0,001

Автор: Pathfider 1.1.2005, 14:42
dsergey Вот тебе все и объяснили, помоему достаточно доходчиво. Есть еще чего непонятного?

Автор: _hunter 1.1.2005, 14:46
смешно smile
даже очень

Автор: Guest 12.10.2005, 17:28
решите кто-нибудь вот это ( тока сёдня надо!!!!!!):
D42(16) - 52(8) + 11011(2)
В скобках система исчисления..... smile

Автор: SoWa 12.10.2005, 18:29
Код

function FromToAnySys(fromSys,ToSys: integer; chislo: string): string;
var
i,k,mo: integer;
d: int64;
buk: int64;
step: int64;
s,sl: string;
s1: int64;
m: string;

function revert(n: string): string;
var i: integer;
q: string;
begin
for i:=length(n) downto 1 do
 begin
  q:=q+n[i];
 end;
 revert:=q;
end;

begin
 m:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 s:='';
d:=0;
for i:=1 to length(chislo) do
 begin
  for k:=1 to 37 do
   begin
    if chislo[i]=m[k] then buk:=k-1;
   end;
  step:=strtoint(floattostr(power(FromSys,(length(chislo)-i))));
  d:=d+(buk*step);
 end;

while d<>0 do
 begin
  mo:=d mod ToSys;
  s:=s+{inttostr(mo)}m[mo+1];
  d:=d div ToSys;
 end;

result:=revert(s);
end;


Посчитай сам...

Автор: cardinal 12.10.2005, 19:17
Или воспользуйся калькулятором в windows...

Автор: MacTep 18.6.2006, 19:12
SoWa, а как сделать, чтобы эта функция еще и дробные числа переводила?  

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