Показать сообщение отдельно
Старый 13.10.2009, 22:14   #3
Tronix
Знающий
 
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений
(для 331 пользователей)
Ответ: Некоторые алгоритмы написанные на чистом pascal-е

Ну конечно не оптимальны, но зато принцип понятен. Понятен принцип - не проблема соптимизить.
А вот я в школе так забавлялся над системами счислений:
Function Dec2Bin(N: Word): String;
Var
   
b : Byte;
   
S : String;
   
T : Byte;
Begin
     S 
:= '';
     
T := 0;
     For 
b := 15 downto 0 do
         
Begin
              
If N and (1 shl b) = 0 then S := S+'0' else S := S+'1';
              
Inc(T);
              If (
T Mod 4 = 0) and (t < 14) then S := S+'.';
         
End;
     
Dec2Bin := S;
End;

Function 
Dec2Hex(N: Word): String;
Const
     
HD : Array [0..15] of Char = ('0','1','2','3','4','5','6','7',
                                   
'8','9','A','B','C','D','E','F');
Begin
     Dec2Hex 
:= (HD[Hi(N) shr 4]+HD[Hi(N) and $F])+
                (
HD[Lo(N) shr 4]+HD[Lo(N) and $F])+'h';
End;

Function 
Dec2Oct(N: Word): String;
Var
   
Mas : String;
   
B,BB: Word;
   
I   : Byte;
   
C   : Char;
Begin
     I 
:= 1;
     
B := N;
     
Repeat
           BB 
:= B div 8;
           
Mas[i] := Chr((B - (8 * BB))+48);
           
B := BB;
           
Inc(I);
     
Until B < 8;
     
Mas[i] := Chr(B+48);
     
Mas[0] := Chr(I);
     For 
I := 1 to Ord(Mas[0]) shr 1 do
         
Begin
              C 
:= Mas[i];
              
Mas[i] := Mas[Length(Mas)-I+1];
              
Mas[Length(Mas)-I+1] := C;
         
End;
     
Dec2Oct := Mas;
End;

Function 
BinAndOct2Dec(N: String; Os: Byte): String;
Function 
Stepen(B,D: Byte): Word;
Var
   
P : Word;
   
II : Byte;
Begin
     P 
:= 1;
     If 
D <> 0 then For II := 1 to D do P := P*B else P := 1;
     
Stepen := P;
End;

Var
   
S    : Word;
   
I    : Byte;
   
T    : String;
Begin
     S 
:= 0;
     For 
I := 1 to Length(N) do
         
Begin
              S 
:= S+((Ord(N[i])-48)*Stepen(Os,Length(N)-I));
         
End;
     
Str(S,T);
     
BinAndOct2Dec := T;
End;

Function 
Hex2Dec(N : String): String;
Const
  
HexDigit   : Array [0..15] of Char = '0123456789ABCDEF';
  
BinNibbles : Array [0..15] of String[4] = (
    
'0000', '0001', '0010', '0011',
    
'0100', '0101', '0110', '0111',
    
'1000', '1001', '1010', '1011',
    
'1100', '1101', '1110', '1111');

Var
   
I,J  : Byte;
   
S    : String;
Begin
     S 
:= '';
     For 
I := 1 to Length(N) do
         
Begin
              
For J := 0 to 15 do If UpCase(N[i]) = HexDigit[J] then
                  S 
:= S+BinNibbles[J];
         
End;
     
Hex2Dec := BinAndOct2Dec(S,2);
End; 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
_Nox_ (13.10.2009)