Часто бывает нужно перевести число из одной системы счисления в другую. Для реализации этой задачи была написана функция на PHP. Посмотреть код класса PHP и проверить работу этой функции можно на странице "Перевод в разные системы счисления". Если же Вам просто нужно перевести одно число в другую систему счисления, то это можно сделать там же.
Как известно, самая популярная система счисления, которой мы пользуемся, десятичная. Но те, кто связан с компьютерами, знают, что есть ещё несколько систем. Та, которой записана информация в компьютере, называется двоичная, т.к. использует лишь две цифры: "0" и "1". Для удобства чтения двоичной информации были придуманы восьмеричная и шестнадцатеричная системы. Цифры в таких системах использовались от "0" до "7" и от "0" до "f" соответственно. Т.е. за неимением специальных цифр, после девятки начинали использовать буквы.
Здесь предлагается возможность перевода из любой системы счисления в любую от двоичной до 128-ричной. В последней после цифр используются буквы: сначала строчные латинские, затем заглавные латинские, а потом то же с кириллицей. Всего получается 128 символов. Переводить можно числа с любым количеством знаков. Но здесь мы ограничимся 128-разрядными числами.
Предлагаю также класс PHP, который решает эту задачу.
/*
*-----------------------------------------------------------------
* Класс занимается переводом из одной системы счисления в другую.
* Класс содержит различные наборы символов для перевода.
* Можно использовать имеющиеся, а можно создавать свои.
*-----------------------------------------------------------------
*/
class Renumeric {
//Полный вариант набора цифр
var $NumSet ='';
//Входящий и исходящий набор цифр
var $InputSet ='';
var $OutputSet ='';
//Буфер временного хранения. Содержит массив целых чисел.
var $Buffer =array();
//Максимальное число в элементе буфера (основание вывода)
var $MaxBufElement =10;
//Код ошибки
/*
*-------------------------------
* 0 - нет ошибки
* 1 - символа нет в наборе
* 2 - символов в наборе больше 1
*-------------------------------
*/
var $Error =0;
/*** Конструктор ***/
function Renumeric(){
$this->NumSet=
'0123456789'. //10
'abcdef'. //16
'ghijklmnopqrstuvwxyz'. //36
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. //62
'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; //128
$this->InputSet =substr($this->NumSet, 0, 16);
$this->OutputSet =substr($this->NumSet, 0, 10);
$this->MaxBufElement=10;
}
/*** Устанавливает входящий и исходящих набор
и оставляет его, пока существует класс ***/
function Preset($InSet, $OutSet){
$this->InputSet=$InSet;
$this->OutputSet=$OutSet;
$this->MaxBufElement=strlen($OutSet);
}
function ADD($n){
$pos=0;
$buf=$n;
do{
if(isset($this->Buffer[$pos])){
$buf+=$this->Buffer[$pos];
}
$this->Buffer[$pos]=$buf % $this->MaxBufElement;
$buf=intval($buf / $this->MaxBufElement);
$pos++;
}while ($buf>0);
}
function MUL($n){
$tmp_buf=array();
$res_len=count($this->Buffer);
if ($res_len==0){
return;
}
$cur_pos=0;
$buf=0;
do{
$a=0;
if ($cur_pos<$res_len){
$a=$this->Buffer[$cur_pos]*$n;
}
$a+=$buf;
$tmp_buf[$cur_pos]=$a % $this->MaxBufElement;
$buf=intval($a / $this->MaxBufElement);
$cur_pos++;
} while(($res_len>$cur_pos)||($buf!=0));
$this->Buffer=$tmp_buf;
}
/*** Переводит из одной системы в другую ***/
function Go($input, $inset=0, $outset=0){
$result=true;
/*** Временное сохранение глобальных наборов ***/
if ($inset!=0 && $outset!=0){
$tmp_in=$this->InputSet;
$tmp_out=$this->OutputSet;
$this->InputSet=substr($this->NumSet, 0, $inset);
$this->OutputSet=substr($this->NumSet, 0, $outset);
$this->MaxBufElement=$outset;
}
/*** Чтение входящего числа ***/
$this->Buffer=array();
$base_in=strlen($this->InputSet);
$count_in=strlen($input);
for ($i=0; $i<$count_in; $i++){
$a=$input[$i];
$present=substr_count($this->InputSet, $a);
if($present==0){
$result=false;
$this->Error=1;
break;
}
if($present>1){
$result=false;
$this->Error=2;
break;
}
if ($i!=0){
$this->MUL($base_in);
}
$this->ADD(strpos($this->InputSet, $a));
}
if ($result){
$result='';
$count_out=count($this->Buffer);
for ($i=0; $i<$count_out; $i++){
$result=$this->OutputSet[$this->Buffer[$i]].$result;
}
}
/*** Восстановление прежних наборов ***/
if (isset($tmp_in)){
$this->InputSet=$tmp_in;
$this->OutputSet=$tmp_out;
$this->MaxBufElement=strlen($tmp_out);
}
return $result;
}
}