0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Перевод из одной системы счисления в другую

Перевод из одной системы счисления в другую

Для перевода чисел из одной системы счисления в другую необходимо владеть основными сведениями о системах счисления и форме представления чисел в них.

Количество s различных цифр, употребляемых в системе счисления, называется основанием, или базой системы счисления. В общем случае положительное число X в позиционной системе с основанием s может быть представлено в виде полинома:

где s — база системы счисления, — цифры, допустимые в данной системе счисления . Последовательность образует целую часть X, а последовательность — дробную часть X.

В вычислительной технике наибольшее применение нашли двоичная (BIN — binary), и двоично кодированные системы счисления: восьмеричная (OCT — octal), шестнадцатеричная (HEX — hexadecimal) и двоично-кодированная десятичная (BCD — binary coded decimal).

В дальнейшем для обозначения используемой системы счисления число будет заключаться в скобки, а в индексе указано основание системы. Число X по основанию s будет обозначено .

Если Вам не нужно углубляться в теорию, а нужно лишь получить результат, то воспользуйтесь Калькулятором онлайн Перевод целых чисел из десятичной системы счисления в другие системы.

Перевод целых и дробных чисел из одной системы счисления в любую другую − теория, примеры и решения

Существуют позиционные и не позиционные системы счисления. Арабская система счисления, которым мы пользуемся в повседневной жизни, является позиционной, а римская − нет. В позиционных системах счисления позиция числа однозначно определяет величину числа. Рассмотрим это на примере числа 6372 в десятичном системе счисления. Пронумеруем это число справа налево начиная с нуля:

число6372
позиция321

Тогда число 6372 можно представить в следующем виде:

6372=6000+300+70+2 =6·10 3 +3·10 2 +7·10 1 +2·10 0 .

Число 10 определяет систему счисления (в данном случае это 10). В качестве степеней взяты значения позиции данного числа.

Рассмотрим вещественное десятичное число 1287.923. Пронумеруем его начиная с нуля позиции числа от десятичной точки влево и вправо:

число1287.923
позиция321-1-2-3

Тогда число 1287.923 можно представить в виде:

1287.923 =1000+200+80 +7+0.9+0.02+0.003 = 1·10 3 +2·10 2 +8·10 1 +7·10 0 +9·10 -1 +2·10 -2 +3·10 -3 .

В общем случае формулу можно представить в следующем виде:

где Цn-целое число в позиции n, Д-k– дробное число в позиции (-k), s – система счисления.

Несколько слов о системах счисления.Число в десятичной системе счисления состоит из множества цифр <0,1,2,3,4,5,6,7,8,9>, в восьмеричной системе счисления – из множества цифр <0,1,2,3,4,5,6,7>, в двоичной системе счисления – из множества цифр <0,1>, в шестнадцатеричной системе счисления – из множества цифр <0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F>, где A,B,C,D,E,F соответствуют числам 10,11,12,13,14,15.

В таблице Таб.1 представлены числа в разных системах счисления.

Таблица 1
Система счисления
102816
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

Алгоритмы перевода чисел в различные системы счисления и их реализация на PHP

В рамках курса «Введение в системный анализ» было получено задание на перевод своей фамилии в различные системы счисления (2, 3, 8, 9, 10, 256, факториальную и фибоначчиевую). Вобщем-то ничего особо сложно, если бы не 24-х разрядное число, которое давала моя фамилия и отказывались считать Excel и ручные калькуляторы (да, стандартный calc.exe считает, но это то еще занудство). Поэтому я, ранее пользовавшийся только VBA и UOpilot’ом, и не найдя в сети единого решения данной задачи и реализации какой-либо его части на PHP, решил познакомиться c PHP и Arbitrary Precision Mathematic. Следует отметить, что в эту сторону меня направил комментарий unnamed777 в этой статье, за что ему большое спасибо.
Подробнее под катом.

Читайте так же:
Как добавить фильм в Айтюнс с компьютера
Текст задания:

«Пользуясь кодовой страницей 1251 (или 0866), запишите свою фамилию в виде числа в 256-чной (байтовой) системе счисления. Заменив каждую 256-чную цифру двумя 16-чными (»дампом»), переведите это число в шестнадцатеричную систему счисления. Затем (уже из шестнадцатеричной) переведите его в системы счисления с основаниями 8, 2, 3, 9, 10.
Наконец, переведите это число в факториальную и фибоначчиевскую системы счисления.
Все нужные определения Вы легко найдёте по ссылкам с www.mashavph.narod.ru/Cheb02/term.htm .».

Теория вопроса:

Поскольку целью данного раздела является прежде всего понимание принципов выполнения упражнения по системам счисления (далее СС) в курсе «Введение в системный анализ», здесь будут рассмотрены алгоритмы преобразования лишь между интересующими нас в пределах данной работы СС, причем только в установленных заданием направлениях.
Итак:

Ряд Фибоначчи — это числовой ряд, где каждый следующий элемент равен сумме двух предыдущих. Любое натуральное число можно представить в виде суммы нескольких членов последовательности Фибоначчи. Такое представление будет неоднозначным, но если наложить дополнительное условие, что в представлении нет двух соседних членов последовательности Фибоначчи, то представление становится единственным. Таким образом к фибоначчиевой СС от 10-й проще всего перейти последовательно вычитая из 10-го числа числа ряда Фибоначчи, начиная с заведомо большего чем 10-е число и записывая логическую характеристику результата этой операции в итоговый ряд. Если при вычитании из 10-го числа числа ряда Фибоначчи получается отрицательное значения — записываем «0» и продолжаем работать с этим же 10-м числом. Если положительное — записываем «1» и далее уже работаем с полученной разностью. Все нули до первой единицы слева можно отбросить. Пример: для числа 23910 и ряда 377 233 144 89 55 34 21 13 8 5 3 2 1 получим 100000001001ф. Пруфлинк.

Примечания:

— Все вышеизложенные операции справедливы для множества натуральных чисел.
— В пунктах 2, 3, 4 и 5 расчеты выполняются по правилам десятичной арифметики.
— Хотя можно встретить описания ряда Фибоначчи как 1, 1, 2, 3, 5, 8.. и 0, 1, 1, 2, 3, 5, 8.., для расчетов в качестве базиса фибоначчиевой СС, как правило, используется ряд 1, 2, 3, 5, 8., что подтверждается в том числе и материалами данных сайтов.

Далее была реализация задуманного на PHP:

<?php
$Surname = [H1toH2]
REQUEST[«Surname»];
$dlina= strlen ($Surname);
if ($dlina > 12) <
echo «Не верю!»;
>elseif ($dlina > 0) <
echo «Фамилия: $Surname<br>»;
echo «Фамилия согласно кодировке Windows-1251:<br>»;
////////////////////////////////////3,8,9
function to($chis, $osn) <
global $st8,$st3,$st9;
$divres = array();
While ($chis > 0) <
$prevchis = $chis;
$chis = bcdiv ($chis, $osn);
$ost = bcmul ($chis, $osn);
$ost = bcsub ($prevchis, $ost);
array_unshift($divres,$ost);
>
while (list(,$val) = each($divres)) <
if ($osn == 3) <
$st3 .= $val;
>
elseif ($osn == 8) <
$st8 .= $val;
>
elseif ($osn == 9) <
$st9 .= $val;
>
>
>
//////////////////////////////////////10 в факториал
function ttfact($chis) <
global $stfact;
global $stf210;
$facdivres = array();
$osn = 2;
While ($chis > 0) <
$prevchis = $chis;
$chis = bcdiv ($chis, $osn);
$ost = bcmul ($chis, $osn);
$ost = bcsub ($prevchis, $ost);
//echo $ost;
//$facdivres .= $ost;
array_unshift($facdivres,$ost);
$osn++;
>
while (list(,$val) = each($facdivres)) <
$stfact .= «$val «;
$i—;
>
>
function lfact($num) < // вычисляем факториал переданного числа
for ( $i = $num — 1; $i > 0; $i—) <
$num = bcmul ($i,$num);
>
return $num;
>

Читайте так же:
Устранение проблем с программой запуска Epic Games

///////////////////////256,16,10,2
$i=0;
$st10 = 0;
while ($i<$dlina) < // в цикле преобразуем каждый символ в ASCII код
$kus = $Surname<$i>;
$ordd = (ord ($kus));
echo «$kus — $ordd<br>»;
$kus = ord ($Surname<$i>); // kus в 256
$st256 .= $kus; //собираем 256-ю строку
$st10 = bcadd ($st10, $kus); // первый $st10 должен быть 0
$st10 = bcmul ($st10, ‘256’); // Самый окончательный результат разделить на $osn
$kus = dechex ($kus); // kus в 16
$st16 .= $kus; // собираем 16-ю строку
$kus = base_convert ($kus,16,2); // kus в 2
$st2 .= $kus; //собираем двоичную строку
$i++;
>
$st10 = bcdiv ($st10, ‘256’);
$i = 0;

////////////////////////////фибоначчи
$stfib = «»;
function fibonacci($n) <
global $arr;
if ($n < 3) <
return 1;
>else <
$n1 = $n — 2;
$n2 = $n — 3;
return bcadd ($arr[$n1], $arr[$n2]);
>
>
for ($n = 1; $n <= 150; $n++) <
$nar = $n — 1;
$arr[$nar] = fibonacci($n);
>

//////////////////////////вывод результатов
echo «Числов 256-чной СС: $st256»;
echo «<br>Число в 16-чной СС: $st16»;
echo «<br>Число в 2-чной СС: $st2»;
to ($st10,3);
echo «<br>Число в 3-чной СС: $st3»;
to ($st10,8);
echo «<br>Число в 8-чной СС: $st8»;
to ($st10,9);
echo «<br>Число в 9-чной СС: $st9»;
echo «<br>Число в 10-чной СС: $st10 (Перевод выполнен по схеме Горнера)»;
ttfact ($st10);
echo «<br>Число в факториальной СС: $stfact (Переводим из 10-й)»;

arsort ($arr);
reset ($arr);
echo «<br>Жирным выделенны числа ряда, задействованные для перевода из 10-й СС в СС на основе ряда Фибоначчи»;
while (list($key,$val) = each($arr)) <
if ( (bccomp($st10, $val)) == -1) <
if ($key == 0) < // хитрая фигнюшка
goto fg;
>
echo «<br>$key <> $val»;
$stfib .= «0»;
>elseif ((bccomp($st10, $val)) >= 0) <
echo «<br>$key <> $val«;
$stfib .= «1»;
$st10 = bcsub($st10, $val);
>
>
fg:<>
echo «<br>В СС на основе ряда Фибоначчи: «;
$stfib = ltrim ($stfib,’0′);
echo «$stfib»;
if ($st10 == 0) <
echo «<br>Фибоначчи сосчитано верно»;
>else <
echo «<br>Alarm $st10»;
>
>
?>

<?php echo «<br>&copy Sindoatan 2010»;?><br>

Как видно из кода, решением проблемы обработки длинных чисел здесь стало использование расширения PHP для длинной арифметики (функции bcadd, bccomp, bcdiv и др.). Поскольку для наглядности должен был выводиться весь используемый ряд Фибоначчи, а переводить требовалось всего 1 слово, вводимая строка была ограничена 12-ю символами, хотя данный способ позволяет обрабатывать и более длинные строки.
Передавалось слово на исполнение следующим способом:
<form method = «post»
action = «result.php»>
Введите фамилию:
<input type = «text»
name = «Surname»
value = «»>
<br>

Результат

Поскольку интересовал меня исключительно итог расчета в виде соответствующих чисел, дизайн соответствует принципам необходимости и достаточности:
Форма ввода
image
Отказ при превышении длины
image
Результат
image
image

image

Вывод

Возможно это тема старших классов школы или первых курсов университета, но мне довелось с ней столкнуться только сейчас. Впрочем, это оказалось весьма интересно. Надеюсь этот материал окажется полезным для вышеозначенной категории людей и не только. Спасибо за внимание.
С уважением, Sindoatan.

[/H1toH2]

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

Рассмотримправило перевода чисел из восьмеричной системы счисления в двоичную.

Читайте так же:
Программа для склеивания видео

Для перевода восьмеричного числа в двоичную систему счисления достаточно заменить каждую цифру восьмеричного числа соответствующим трехразрядным двоичным числом.После этого необходимо удалить нули, стоящие слева от старшего разряда в целой части, а при наличии дробной части – также нули, стоящие справа от младшего разряда в дробной части.

Перевод числа из шестнадцатеричной системы счисления в двоичную выполняется аналогично. Только в этом случае каждая цифра шестнадцатеричного числа заменяется соответствующим четырехразрядным двоичным числом.

Перевести число 305.4 из восьмеричной системы счисления в двоичную.

Переводимое число Результат

(3 0 5. 4)(8) = 11000101.1(2)

011 000 101. 100

Перевести число 7D2.E из шестнадцатеричной системы счисления в двоичную.

Переводимое число Результат

(7 D 2. E)(16) = 11111010010.111(2)

0111 1101 0010. 1110

Для перевода числа издвоичнойсистемы счисленияввосьмеричную (илишестнадцатеричную) поступают следующим образом: двигаясь от запятой сначала влево, а затем вправо, разбивают двоичное число на группы по три (четыре) разряда, дополняя, при необходимости, нулями крайние левую и правую группы. Затем каждую группу из трех (четырех) разрядов заменяют соответствующей восьмеричной (шестнадцатеричной) цифрой.

Пример. Перевести число 111001100.001 из двоичной системы счисления в восьмеричную, а число 10111110001.001 – из двоичной системы счисления в шестнадцатеричную.

Переводимое число Результат

(111 001 100. 001)(2) = 714.1(8)

Переводимое число Результат

(0101 1111 0001. 0010)(2) = 5F1.2(16)

Представление информации в цифровых

Для автоматизации работы с данными, относящимися к различным типам, очень важно унифицировать их форму представления. Для этого обычно используется прием, называемый кодированием.Суть кодирования состоит в выражении данных одного типа через данные другого типа. Естественные человеческие языки – это не что иное, как системы кодирования понятий для выражения мыслей посредством речи. К языкам близко примыкают азбуки (системы кодирования компонентов языка с помощью графических символов).

В вычислительной технике используется своя система кодирования, называемая двоичным кодированием. Она основана на представлении данных последовательностью всего двух знаков: 0 и 1. Одним битом могут быть выражены два понятия: 0 или 1 (да или нет, черное или белое, истина или ложьи т.п.). Если количество битов увеличить до двух, то уже можно выразить четыре различных понятия:

Тремя битами можно закодировать восемь различных значений:

000 001 010 011 100 101 110 111

Увеличивая на единицу количество разрядов в системе двоичного кодирования, мы увеличиваем в два раза количество значений, которое может быть выражено в данной системе, то есть, в общем случае:

где N – количество независимых кодируемых значений;

n – разрядность двоичного кодирования, принятая в данной системе.

Для представления символьной информации в средствах автоматизированной обработки (например, ЭВМ) также используется двоичное кодирование. Если каждому символу алфавита сопоставить определенное целое число (например, порядковый номер), то с помощью двоичного кода можно кодировать и текстовую информацию. Восьми двоичных разрядов достаточно для кодирования 256 различных символов. Этого хватит, чтобы выразить различными комбинациями восьми битов все символы английского и русского языков, как строчные, так и прописные, а также знаки препинания, символы основных арифметических действий и некоторые общепринятые специальные символы, например §, $, / и др.

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

Институт стандартизации США (ANSI – American National Standard Institute)ввел в действие систему кодирования ASCII (American Standard Code for Information Interchange – стандартный код информационного обмена США). В системе ASCIIзакреплены две таблицы кодирования – базовая и расширенная.Базовая таблица закрепляет значения кодов от 0 до 127, расширенная относится к символам с номерами от 128 до 255.

Читайте так же:
Правильная вставка текста в AutoCAD

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

Начиная с номера 32 по номер 127 в таблице ASCII размещены коды символов английского алфавита, знаков препинания, цифр, арифметических действий и некоторых вспомогательных символов. Коды букв русского алфавита располагаются в расширенной таблице ASCII (кодировка «Windows — 1251») начиная с номера 192 (рисунок 2).

Аналогичные системы кодирования текстовых данных были разработаны и в других странах. Так, например, в СССР в этой области действовала система кодирования КОИ-7 (код обмена информацией, семизначный). Другая распространенная кодировка носит название КОИ-8 (код обмена информацией, восьмизначный) – ее происхождение относится ко временам действия Совета Экономической Взаимопомощи государств Восточной Европы. Сегодня кодировка КОИ-8 имеет широкое распространение в компьютерных сетях на территории России и в российском секторе Интернета.

Однако поддержка производителей оборудования и программ вывела американский код ASCII на уровень международного стандарта, и национальным системам кодирования пришлось отступить во вторую, расширенную часть системы кодирования, определяющую значения кодов со 128 по 255.

В связи с изобилием систем кодирования текстовых данных, действующих в России, возникает задача межсистемного преобразования данных – это одна из распространенных задач информатики.

Рисунок 2 – Базовая и расширенная таблицы ASCII


Если проанализировать организационные трудности, связанные с созданием единой системы кодирования текстовых данных, то можно прийти к выводу, что они вызваны ограниченным набором кодов (256). В то же время очевидно, что если, например, кодировать символы не восьмиразрядными двоичными числами, а числами с большим количеством разрядов, то и диапазон возможных значений кодов станет намного больше. Такая система, основанная на 16-разрядном кодировании символов, получила название универсальной – UNICODE. Шестнадцать разрядов позволяют обеспечить уникальные коды для 65 536 различных символов – этого поля достаточно для размещения в одной таблице символов большинства языков планеты.

Несмотря на тривиальную очевидность такого подхода, простой механический переход на данную систему долгое время сдерживался из-за недостаточных ресурсов средств вычислительной техники (в системе кодирования UNICODEвсе текстовые документы автоматически становятся вдвое длиннее). Во второй половине 90-х годов технические средства достигли необходимого уровня обеспеченности ресурсами, и сегодня мы наблюдаем постепенный перевод документов и программных средств на универсальную систему кодирования.

Кроме символьных данных современные компьютеры позволяют обрабатывать и другие типы данных, например – графические. Остановимся на способах кодирования таких данных.

Если рассмотреть с помощью увеличительного стекла черно-белое графическое изображение, напечатанное в газете или книге, то можно увидеть, что оно состоит из мельчайших точек, образующих характерный узор, называемый растром. Поскольку линейные координаты и индивидуальные свойства каждой точки (яркость) можно выразить с помощью целых чисел, то можно сказать, что растровое кодирование позволяет использовать двоичный код для представления графических данных. Общепринятым на сегодняшний день считается представление черно-белых иллюстраций в виде комбинации точек с 256 градациями серого цвета, и, таким образом, для кодирования яркости любой точки обычно достаточно восьмиразрядного двоичного числа.

Читайте так же:
Изменение ориентации страницы (альбомная или книжная)

Для кодирования цветных графических изображений применяется принцип декомпозиции произвольного цвета на основные составляющие. В качестве таких составляющих используют три основные цвета: красный (Red, R), зеленый (Green, G) и синий (Blue, B). На практике считается (хотя теоретически это не совсем так), что любой цвет, видимый человеческим глазом, можно получить путем механического смешения этих основных цветов. Такая система кодирования называется системой RGB по первым буквам названий основных цветов.

Если для кодирования яркости каждой из основных составляющих использовать по 256 значений (восемь двоичных разрядов), как это принято для полутоновых черно-белых изображений, то на кодирование цвета одной точки надо затратить 24 разряда. При этом система кодирования обеспечивает однозначное определение 16,5 млн. различных цветов, что на самом деле близко к чувствительности человеческого глаза. Режим представления цветной графики с использованием 24 двоичных разрядов называется полноцветным(True Color).

Каждому из основных цветов можно поставить в соответствие дополнительный цвет, то есть цвет, дополняющий основной цвет до белого. Нетрудно заметить, что для любого из основных цветов дополнительным будет цвет, образованный суммой пары остальных основных цветов. Соответственно, дополнительными цветами являются: голубой (Cyan, C), пурпурный (Magenta, M) и желтый (Yellow, Y). Принцип декомпозиции произвольного цвета на составляющие компоненты можно применять не только для основных цветов, но и для дополнительных, то есть любой цвет можно представить в виде суммы голубой, пурпурной и желтой составляющей. Такой метод кодирования цвета принят в полиграфии, но в полиграфии используется еще и четвертая краска – черная (Black, K). Поэтому данная система кодирования обозначается четырьмя буквами CMYK (черный цвет обозначается буквой К, потому, что буква В уже занята синим цветом), и для представления цветной графики в этой системе надо иметь 32 двоичных разряда. Такой режим тоже называется полноцветным(True Color).

Если уменьшить количество двоичных разрядов, используемых для кодирования цвета каждой точки, то можно сократить объем данных, но при этом диапазон кодируемых цветов заметно сокращается. Кодирование цветной графики 16-разрядными двоичными числами называется режимом High Color.

При кодировании информации о цвете с помощью восьми бит данных можно передать только 256 цветовых оттенков. Такой метод кодирования цвета называется индексным. Смысл названия в том, что, поскольку 256 назначений совершенно недостаточно, чтобы передать весь диапазон цветов, доступный человеческому глазу, код каждой точки растра выражает не цвет сам по себе, а только его номер (индекс) в некоей справочной таблице, называемой палитрой. Разумеется, эта палитра должна прикладываться к графическим данным – без нее нельзя воспользоваться методами воспроизведения информации на экране или бумаге (точнее, воспользоваться, конечно, можно, но из-за неполноты данных полученная информация не будет адекватной: листва на деревьях может оказаться красной, а небо – зеленым).

Статьи к прочтению:

Перевод чисел, системы счисления с основанием 2, 8, 16

Похожие статьи:

Лекция №4 Системы счисления. План 1. Непозиционные и позиционные системы счисления. 2. Системы счисления, используемые в электронно-вычислительных…

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector