Представление числа в двоичной системе счисления
Калькулятор для целых чисел в двоичной системе счисленияСоздать программу – калькулятор для целых чисел в двоичной системе счисления. Должны быть кнопки +.
Задано неотрицательное целое число в двоичной системе счисления. Требуется перевести его в десятичную.Задано неотрицательное целое число в двоичной системе счисления. Требуется перевести его в.
Проверить правильность ввода числа в двоичной системеДано число в двоичной системе счисления. Проверить правильность ввода этого числа (в его записи.
ну, некоторые моменты по поводу систем счисления скажу я, т.к. влом ссылки искать:
1) система счисления может иметь любое целое положительное основание, отличное от единицы (в смысле двоичная, десятичная и т.д.)
2) количество систем счислений безгранично (т.к. я могу придумать и троичную, и десяти_тысячно_пятдесят_шестиричную)
3) наиболее удобны те системы счисления, чьё основание кратно степени двойки (восьмиричная, шестнадцатиричная, т.к. они очень просто переводятся в двоичную и обратно)
к примеру перевод числа из 16ой СС в 2ую: каждому числу в 16ой СС соответсвует 4 в двоичной. дальше рисуются соответсвия вида:
И перевод становится элементарным: к примеру отобразить в довичной СС число F3 F=1111 3=0011 итого F3==11110011
Не совсем понятна природа Вашего вопроса, да и его суть. Надеюсь всё же среди написанного найдётся что-то "в тему".
Общий принцип систем исчисления состоит в том, что когда в одном разряде исчерпаны все символы для обозначения количества (для 16-ричной это 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F, для двоичной 0-1), то этот разряд сбрасывается (обычно в ноль) на начальное значение, а следующий разряд получает приращение на один шаг.
Те кто программирует постоянно, особенно те, кто на ассемблере что-то вояет свободно переводят подобные числа в hex или binary просто в голове, так же как обычные люди обращаются с цифрами в десятичной системе. Важно понимать, что десятичная система ничем не примечательна относительно других, тем паче мне странно наблюдать когда люди стремяться к "круглым" цифрам. Круглые они в одной системе, но не круглые в другой, а количество обозначают одно и тоже. Так что это чисто психологический момент. В большинстве случаев программисту нет нужды переводить числа из одной системы в другую - это, как правило, уже реализовано. Изначально аппаратная природа компьютера приспособлена для операций с двоичными числами - это происходит от электрического уровня организации компьютера и процессора, в частности, которые общаются с помощью сигналов с двумя устойчивыми состояниями (высокий и низкий уровень). На логическом уровне это выливается в единицу (1) и ноль (0). Таким образом, с какими бы числами не работал компьютер, он, на самом деле, всегда работает с двоичными числами. А ежели так, то логично было бы просто взять у него число прямо в таком представлении, раз уж нам надо. Почти во всех языках программирования такая возможность есть. Обычно там уже есть аппарат для свободной работы с двоичными, десятичными, шестнадцатиричными числами. Шестнадцатиричная система существенно компактнее двоичной в плане записи и видимо по этой причине и вошла в применение (возможно исторически было немного не так). Обращение программиста к двоичной системе часто связано с необходимостью создания какого либо алгоритма. Например, умножение или деление кратное 2 более экономно реализовать сдвигом битов на один или несколько позиций - при сдвиге на одну позицию значение числа будет изменяться в 2 раза. Подобные сдвиги реализованы на уровне команд процессора и их выполнение очень экономично в сравнении с отработкой обычного алгоритма умножения или деления. Это лишь один из примеров, наиболее понятный по сути. Часто работа с двоичными числами связана с необходимостью логических операций, с помощью так называемой булевой алгебры, логика которой завязана на два состояния - TRUE (1) и FALSE (0).
Перевод числа из двоичной системы можно реализовать различными методами. Будем считать, что число 94 хочет перевести в двоичную форму человек без всяких приспособлений. Каждый следующий разряд двоичной системы имеет "вес" в два раза отличающийся от соседнего (у 10-тичной системы отличие в 10 раз): bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 128_64_32__16__8__4___2___1 Смотрим какое ближайшее к 94 значение - это 64. Выставляем bit6=1. Вычитаем 94-64=30. Проделываем с 30 тоже самое, что и с 94 - ищем ближайшее значение. И так далее. На самом деле когда осталось 30 это число чисто умозрительно легко набрать из значений 16+8+4+2, фактически не производя никаких вычислений, просто подбирая последовательно значения. Все биты, участвующие в "наборе" числа 94 выставляем в 1, остальные 0. Получается 01011110.
Yurek, нормально объяснил Хотя в следующий раз лучше стену текста абзацами с красной строкой побольше разбавляйте
Spectral-Owl, скажу вам по скеркету, что основанием системы счисления может быть любое действительное число, а не только 2 3 и десяти_тысячно_пятдесят_шестиричная. Например, как вам СС с основанием пи, или е? Вообще из курса теории информации оказывается, что оптимальное основание системы счисление равно е. Оптимальная по таким параметрам - с одной стороны требуется минимальный алфавит, с другой стороны - длина сообщения должна быть тоже наименьшей. Минимумом это функции от двух параметров является решение уравнения lnP = 1, откуда P=e Подробнее: вики http://ru.wikipedia.org/wiki/%. 0.B8.D1.8F И тут покороче: http://xax.al.ru/aout/c1.htm
1. Существует ли оптимальное основание системы счисления?
Посмотрим на график функции, изображенный на рисунке 1. http://xax.al.ru/aout/b4.files/image001.gif
Нетрудно показать [8], что максимум достигается в точке х = е, где е – трансцендентное число, которое приближенно равно 2.71828… ( ©Эйлер ).
Поскольку е уже является основанием натурального логарифма, то основанием системы счисления для целых чисел быть не может. Вот такая логика.
Здесь мы запускаем второй закон природы, закон развития – струя дырочку найдет.
Воспользуемся услугами смешанной системы счисления, то есть системы счисления с несколькими основаниями.
Запишем число в виде поличлена
x = x0·q0 + x1·q1 + … + xn·qn . (2.1)
Взглянем формально на это выражение.
Здесь xi можно интерпретировать в качестве признаков, свойств, координат числа х.
Символы qi совсем не обязательно должны обозначать степенную функцию, просто в этом случае разложение (2.1) единственно, но такой мелочью можно пренебречь.
Вспомним формулы (1.3) – (1.5).
Выделим основное свойство системы счисления с постоянным основанием. Для этого добавим в (2.1) один разряд. Получим, что общее количество символов hq увеличилось на q символов, тогда как, общее количество чисел Nq возросло в q раз. Таким образом, имеем взаимно однозначное отображение
где i любое натуральное число, в нашем случае.
В смешанной системе счисления, добавление одного члена в формулу (2.1), очевидно, приведет к неравномерному увеличению hq , но отображение (2.2) должно оставаться взаимно однозначным.
Далее, поскольку число е лежит между 2 и 3, то основания смешанной системы счисления попытаемся найти в виде линейной смеси двоек и троек. Для этого, перепишем соотношение (2.2) в следующем виде
2·a + 3·b ↔ 2a·3b , (2.3)
где a и b пока не определенные целые индексы.
Подгоним a и b так, чтобы сохранялось условие взаимной обратимости отображения (2.3). В итоге получим результат в виде следующего правила – индекс b пробегает всю область натуральных чисел, а индекс a только 0,1,2.
Посмотрим, что получилось.
Изменяя индексы a и b , таким нехитрым способом, мы можем добиться того, что hab изменяется равномерно на единицу, как будто мы используем систему счисления с основанием равным единице. Далее, Nab изменяется уж очень знакомо, получается так, что ряд, образованный троичной системой счисления ( 3b , 2·3b ) разбавлен числами 4·3b, но в следующей последовательности
( 3b , 4·3b , 2·3b ) , (2.4)
или как показано на рисунке 2.
Здесь, в синих кружках, показаны вставки в троичную систему счисления.
Получилось! Это то, что нам надо. Теперь на координатные точки (2.4), как на скелет, можно натягивать натуральные, целые и даже рациональные числа.
Прежде всего, введем новые обозначения.
Заменим hq на L и дадим ему термин символьный логарифм.
Заменим Nq на E и дадим ему термин символьная экспонента.
Прямое отображение (2.3) обозначим функцией
С помощью таблицы 1 сформулируем правила вычисления этих функций.
Для функции e( ) правило - остаток от деления L на 3 дает 2·a, а целое есть 3·b, тогда E = 2a · 3b.
Для функции l( ) правило - делим E нацело b раз, остальное будет 2a, тогда L = 2·a + 3·b.
В конечном итоге, доопределим эти функции в начале числовой оси, и оформим таблицу, расширив диапазон на область целых чисел – рисунок 3.
Справа, на графике, показаны значения функции E = e(L).
Довольно долго не попадалось мне на глаза что-либо похожее, ни в Интернете, ни в научной литературе, но потом нашел. Оказывается, данная тема интересует структурных лингвистов. В статье [9] приводится строгое доказательство оптимальности данной функции для эффективного разбиения множества объектов любой природы по именным признакам. Нам будет достаточно утверждения того, что e( ) является не только оптимальной, но и единственной из всех возможных функциональных отображений вида (2.3), и определенной на всем множестве целых чисел.