Меню сайта
Наш опрос
Оцените мой сайт
Всего ответов: 6
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2014 » Июль » 22 » Перевод натурального числа в двоичную систему счисления и обратно
15:25
Перевод натурального числа в двоичную систему счисления и обратно

Не совсем олимпиадная задача, но все же я подробно остановлюсь на ней, так как есть несколько вариантов решения этой задачи.Известно, что остатки от деления на 2 дают цифры в двоичной системе.Например, дано число 19:19: 2 = 9 целых 1 в остатке  9: 2 = 4 целых 1 в остатке  4: 2 = 2 целых 0 в остатке  2: 2 = 1 целых 0 в остатке  1: 2 = 0 целых 1 в остаткедальнейшие действия бесполезны: на ноль делим - получим ноль целых и ноль в остатке.Для получения итогового числа собираем остатки с конца, получим: 10011Итак, мы видим цикличность действий и условие останова (окончания цикла).Запишем через переменные:а - исходное число и число, которое делим на 2с - остаток от 0' else 1';end;writeln(s); По нашему мнению это правильно. Но давайте проверим:Введем а = 19, т.к. a не равно 0 идем выполнять тело цикла:a = a div 2 = 19 div 2 = 9c = a mod 2 = 1 mod 2 =1Что получается? Изменилось значение переменной а сразу после первого оператора присваивания! Возникает вопрос: а если поменять местами два оператора, что изменится?c = a mod 2 = 19 mod 2 = 1a = a div 2 = 19 div 2 =9Что и требовалось в итоге.Перепишем код 0' else 1';end;writeln(s); Теперь посмотрим как собирается строка:так как остаток равен 1, то выполнится оператор после слова 1' =''+ Переходим к началу цикла и проверяем условие продолжения цикла (т.е. отрицание условия останова): a<>0 (9<>0) и выполняем тело цикла:c = a mod 2 = 9 mod 2 = 1a = a div 2 = 9 div 2 = 4s=s++'1'='11'Продолжим выполнение до выхода из цикла:c = a mod 2 = 4 mod 2 = 0a = a div 2 = 4 div 2 = Стоп! Но ведь в результате стоит все наоборот: 10011, а не как у нас 110! Это потому что мы присоединяем цифры справа, а не слева полученной строки. Изменим оператор:if  +s else +s;До этого все было нормально, теперь с измененным И так далее.Теперь рассмотрим второй вариант: используя операции shl и  shr - битовые сдвиги влево и вправо. Число 19 в двоичной системе и в памяти компьютера 00010011. Операция битового сдвига выглядит так:19 shl 1 = [00100110]19 shr 1 = [00001001]Чтобы отличать десятичное число от двоичного представления, последнее заключим в квадратные скобки. Что мы имеем? При сдвиге влево все биты сдвигаются влево и добавляется 0 справа, а при сдвиге вправо все биты сдвигаются вправо, теряя 1 младший разряд, и добавляется 0 слева. Что нам это дает? Если сделаем сдвиг вправо, потом влево, то получим число без единицы, т.е. если вычитаем результат битовых операций из исходного числа, то получим младший разряд в двоичном представлении 0')+c)+s; end;writeln(s); Объясню как образуется строчка0')+c)+s;Цифры в таблице ASCII стоят по порядку от '0' до '9', поэтому, зная код нуля ord('0') и прибавляя нужное число C, можно получить символ, соответствующий этому числу.В случае, если число достаточно большое, то используйте работу с вещественными числами (например, тип comp - у него нет дробных чисел) или длинную арифметику.Теперь рассмотрим  обратный then  0' или '1'. Зная правила кодирования символов, для получения цифры из символа , воспользуемся следующим 0');Объясню еще раз: символы цифр в таблице ASCII стоят подряд:'0' - допустим у нуля десятичный код 87'1' - тогда у единицы код 88'2' - у двойки код 89... - и т.д.Если знаем код числа и нуля - вычитаем и получаем соответствующую цифру:ord('0') - ord('0') =  88-88 =0 ord('1') - ord('0') =  88-87 =1ord('2') - ord('0') =  89-87 =2и т.д.Запишем код


Вас интересует диплом? Купить диплом
Просмотров: 380 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Форма входа
Календарь
«  Июль 2014  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей