из 16ой в 2ую

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

Если нужен совет, то каждая цифра или буква шеснадцатиричного коде будет представлена четырьмя битами двоичного счисления!
(1h->0001 2h->0010 ... F->1111)
Всё это обрабатывается в цикле.

Если надо сделать, то в другой раздел :)
Pepper
Сообщения: 33
Зарегистрирован: 21 фев 2004, 23:50
Откуда: Мурманск
Контактная информация:

Нужно разделить число на основание системы, в которую переводят (в данном случае на 2) и найти остаток. Если целая часть частного получилась не равной нулю то ее делят на основание системы счисления. Так продолжают до тех пор, пока целая часть частного не станет равной нулю.

Код: Выделить всё

a:=0; //a - число которое мы должны в итоге получить
r:=1; 
while n>=1 do // n-число в той системе счисления из которой переводим
begin
 a:=a+(n mod p)*r; // p- основание системы в которую переводим
 r:=r*10;
 n:= n div p;
end;
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Вообще-то для хранения двоичных чисел лучше использовать строки (в идеале, конечно, boolean, но он сложно представим). Иначе число, большее 1024, будет представлено комбинацией 0 и 1 длиной более 10 символов, а это даже в longint не влезет. А для 16-ричных чисел сам Вирт велел пользоваться стрингами. Поэтому я из 10-й в 2-ю обычно перевожу так

Код: Выделить всё

function dec2bin(x:integer):string;
  var s:string;
begin
 s:='';
 while x>0 do
 begin
   s:=chr(ord('0')+x mod 2)+s;
   x:=x div 2;
 end;
 dec2bin:=s;
end;
А если переводить из 10-й в 16, придется поизвращаться. Цикл внутри функции будет выглядеть так:

Код: Выделить всё

 while x>0 do
 begin
   if x mod 16 <10 then
   s:=chr(ord('0')+x mod 16)+s
   else
   s:=chr(ord('A')+(x mod 16 - 10))+s;
   x:=x div 16;
 end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вот вы все о целых числах, а с дробными слабо? ;)
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Лады. Тогда так: в начале работы программы пишем:

Код: Выделить всё

const N=20;{сколько символов отводится на запись числа}
var x,fracx:real; intx:longint;
begin
  intx:=trunc(x);
  fracx:=frac(x);
{Дальше intx переводится в 2х или 16х, как учили. Результат пусть лежит в строке s}
  s:=s+'.';
  while length(s)<=N do
  begin
     fracx:=fracx*2; {или на 16 соответственно}
     s:=s+dec2bin(trunc(fracx)); {или опять же, dec2hex соответственно}
     fracx:=frac(x);
  end;
To Naeel Maqsudov: только не надо просить еще и с отрицательными числами делать, ладно? Так не хочется возиться со всеми этими обратными кодами, дополнительными кодами... Полгода как это сдал, и обратно вспоминать не хочу! :) )
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Shakal
Сообщения: 1
Зарегистрирован: 13 окт 2006, 23:18

Всем хай! у меня такая же проблема как и у 000 я не могу перевести из 16ти ричной в 2ую хм GOS не мог бы по конкретнее объяснить (если можно уже сделанную ) ) выложить ?) :wink:
Ответить