А . . Я

Персональная страница Андрея Якушева

Социальные сети

Перевод в разные системы счисления

Главная Программирование Скрипты Перевод в разные системы счисления

Иногда бывает нужно перевести число из одной системы счисления в другую. Для реализации этой задачи была написана функция на PHP. Если же вам просто нужно перевести одно число в другую систему счисления, то это можно сделать здесь же.

Как известно, самая популярная система счисления, которой мы пользуемся, — десятичная. Но те, кто связан с компьютерами, знают, что есть ещё несколько систем. Та, которой записана информация в компьютере, называется двоичная, т.к. использует лишь две цифры: «0» и «1». Для удобства чтения двоичной информации были придуманы восьмеричная и шестнадцатеричная системы. Цифры в таких системах использовались от «0» до «7» и от «0» до «f» соответственно. Т.е. за неимением специальных цифр, после девятки начинали использовать буквы.

Здесь предлагается возможность перевода из любой системы счисления в любую от двоичной до 128-ричной. В последней после цифр используются буквы: сначала строчные латинские, затем заглавные латинские, а потом то же с кириллицей. Всего получается 128 символов. Переводить можно числа с любым количеством знаков. Но здесь мы ограничимся 128-разрядными числами.

Основание источника Источник Основание результата

Предлагаю также класс PHP, который решает эту задачу.

<?php
/*
 *-----------------------------------------------------------------
 * Класс занимается переводом из одной системы счисления в другую.
 * Класс содержит различные наборы символов для перевода.
 * Можно использовать имеющиеся, а можно создавать свои.
 *-----------------------------------------------------------------
 */

class Renumeric {

   //Полный вариант набора цифр
   var $NumSet ='';
   
   //Входящий и исходящий набор цифр
   var $InputSet      ='';
   var $OutputSet      ='';

   //Буфер временного хранения. Содержит массив целых чисел.
   var $Buffer         =array();

   //Максимальное число в элементе буфера (основание вывода)
   var $MaxBufElement   =10;

   //Код ошибки
   /*
    *-------------------------------
    * 0 - нет ошибки
    * 1 - символа нет в наборе
    * 2 - символов в наборе больше 1
    *-------------------------------
    */
   var $Error         =0;

   /*** Конструктор ***/
   function __construct(){
      $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;
   }
}