2012-05-08 1 views

ответ

4

Преобразование двоичных чисел в десятичные числа обычно работает как цикл повторного разделения. Если мы начнем с числа N, (N mod 10) будет последней цифрой, а затем мы продолжим деление N на 10 и повторение, чтобы получить другие цифры.

  1. Начнем с N = 51
  2. 51 мод 10 1. Конечный цифра 1.
  3. Деление на 10, чтобы отбросить цифру мы просто извлеченную (целочисленное деление раундов), давая 5.
  4. (это повторение шага 2 с разным N) 5 mod 10 равно 5. Следующая цифра равна 5.
  5. 5/10 - 0 (округление), и поэтому мы закончили. Цифры в обратном порядке: 1 и 5.
  6. Мы добавляем по 48 каждому значению цифры, чтобы получить соответствующие десятичные цифры в ASCII.
  7. Итак, конечный результат - «51».

Преобразование из строки во внутреннее представление еще проще.

  1. Старт с 0 в аккумуляторе
  2. Возьмите первый символ (здесь "5"). Это ASCII 53. Вычитайте 48, чтобы получить 5.
  3. Добавьте к нашему аккумулятору, чтобы получить 0 + 5 = 5.
  4. Обратите внимание, что есть еще одна цифра. Умножьте аккумулятор на 10, чтобы получить 50.
  5. Вернитесь к шагу 1

В следующей итерации (т.е. для "1" = ASCII 49) Вычесть 48 раз: 49-48 = 1. Мы добавляем 1 к аккумулятору, давая 51. Больше никаких символов, поэтому мы закончили, и результат равен 51.

Тот факт, что внутреннее представление компьютера является двоичным, является случайным. Нам нужно только добавить, вычесть и умножить, чтобы преобразовать строку в число внутри компьютера.

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

+0

Спасибо, это то, что я искал. – beary605

+1

Думаю, вам нужно исправить некоторый modulo vs. division в первой части вашего ответа. Я знал, что вы значит, вы действительно не следовали за с логикой в ​​шагах, и использовали по модулю и делению взаимозаменяемые. – bcdan

0

Он не поворачивает их в любом случае. 53 всегда является памятью 53.

Что происходит, когда нужно отобразить, вызывается функция, которая знает, что когда она видит номер 53, она генерирует графику, которую наши глаза видят как 5. Или в памяти он может превратить номер 53 в номера 53 и 51, которые в конечном итоге будут отображены в виде символов "5" и "3".

И 53 всегда 110101. Ячейка памяти представляет собой последовательность бит и содержит десятичные значения 53 как биты 001101011.

Опять же, есть функции, которые видят эти биты и могут генерировать на экране символ "5" и символ "3".

Но внутри компьютера всегда его номера и его всегда двоичные.

+0

Итак, вы говорите, что компьютеры не вычисляют с использованием 51, а вместо этого имеют несколько разных чисел 53 и 49, которые используются для вычислить? – beary605

+0

Ум нет. Например, fprintf/String.format принимает двоичные целые числа в памяти и создает символьные строки в памяти. Нет «графики». – bmargulies

+0

Но как он «создает символьные строки в памяти», используя двоичные целые числа? – beary605

0

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

+0

Дело в том, что я не знаю, как это сделать. Вот почему я спрашиваю. – beary605

+0

Сначала вам нужно цифра единиц. Это ваш номер mod 10, индексированный в массив символов 0-9. Затем вам нужно получить цифру 10. Затем цифра 100 ... Просто подумайте об алгебре, разделив число на свои цифры. скачайте открытый исходный код glibc и прочитайте исходный код itoa. – bmargulies

0

Чтобы включить двоичный в ASCII:

1) принять ваш номер делит его на 10 десятичных (1010 двоичных) и вычисляет остаток . 2) С остатком добавьте 48 (значение ASCII для «0»). Это дает вам последнюю цифру. 3) Если коэффициент равен 0, остановите . 4) Если коэффициент больше 0, начните снова с шага 1 с использованием коэффициента.

Например. Преобразовать 51 (110011) в ASCII с использованием основы 10 (1010):

110011/1010 = 0101 (5 decimal) remainder 0001 


0001 (the remainder from above) + 110000 ('0') = 110001 (49 decimal or '1' in ASCII) 

0101 (the quotient from above)/1010 = 0 remainder 0101 
0101 (the remainder) + 110000 ('0') = 110101 (53 decimal or '5' in ASCII)