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

Шаги

Метод 1 из 2:

Способ 1: Используя сложение

  1. 1

    Запишите пример. Если вы решаете пример 4 x 3

    Это – повторное сложение, число повторяется 3 раза.

    , то можно также сказать «3 раза по 4».

  2. 2

    Решите, используя повторное сложение. Три раза сложите 4. 4 + 4 + 4 = 12

    Можно использовать и 4 группы по 3. Ответ будет тот же, только складывать нужно 3 + 3 + 3 + 3. Вы получите 12, тот же ответ.

Метод 2 из 2:

Способ 2: Умножение в столбик

  1. 1

    Запишите умножаемые числа в столбик: большее число – наверху, меньшее – внизу. Записывайте так, чтобы разряды «единицы», «десятки», «сотни», «тысячи» и т.д. двух чисел были в столбиках. В примере 187 * 54,

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

    7 должна быть над 4, 8 над 5, 1 над пустым местом, ведь 54 не имеет разряда сотен.

  2. 2

    Умножьте цифру в единицах нижнего числа на цифру в разряде единиц верхнего числа.

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

    Умножьте 4 * 7. Ответ: 28, запишите 8 из этого числа под 4, а 2 над 8.

  3. 3

    Умножьте цифру в разряде единиц нижнего числа на цифру в разряде десятков верхнего числа. Сначала вы умножили 4 на цифру в разряде единиц, теперь умножайте на цифру в разряде десятков. Умножьте 4 на 8, знак слева от 7. 7 х 8 =32. Помните, что над 8 поместили 2. Теперь добавьте ее к ответу. 32 + 2 =34.

    • Перенесите 4 из числа 34 под линию, под цифру 8 – рядом с той самой восьмеркой, которую вы записали ранее.
    • Перенесите 3 из числа 34 над 1 в числе 187.
  4. 4

    Умножьте цифру в разряде единиц нижнего числа на цифру в разряде сотен верхнего числа. Только что вы умножили на цифру в десятках, теперь – на цифру в сотнях. 4 х 1 = 4. Теперь добавьте к ответу пересенную цифру наверх. Запишите ответ в нижней строке (под 1).

    • Вы только что умножили 187 на 4 столбиком и получили 748.
    • Заметьте, если бы верхнее число было четырех- или пятизначным, вы бы просто повторяли процесс умножения до тех пока, пока не перемножили бы цифру в разряде единиц нижнего числа на все цифры верхнего числа, продолжая переходить справа налево.
  5. 5

    Подставьте ноль в место под нашим ответом, под 8 в 748. Это служит для того, чтобы отметить, что вы переходите к умножению цифры в разряде десяток.

  6. 6

    Умножьте цифру в разряде десятков нижнего числа на цифру в разряде единиц верхнего.

    Запишите 5 из 35 слева от 0 и перенесите 3 из 35 над 8 вверху.

    5 на 7 будет 35.

  7. 7

    Умножьте цифру в разряде десятков нижнего числа на цифру в разряде десятков верхнего.

    Запишите 3 из 43 слева от 5, и перенесите 4 из 43 над 1 вверху.

    5 на 8 = 40. Добавьте 3 сверху, получится 43.

  8. 8

    Умножьте цифру в разряде десятков нижнего числа на цифру в разряде сотен верхнего.

    Вы столбиком умножили 5 на 1870. Ответ в этой части получился 9350.

    Умножьте 5 на 1, будет 5. Добавьте 4 сверху, получится 9. Запишите рядом с 3.

  9. 9

    Сложите верхний и нижний ответ.

    748 + 9350 = 10098

    Просто сложите 748 и 9358 и будет окончательный ответ.

Неважно, какое число сверху, а какое – снизу.
Помните: при умножении на ноль получаем ноль.
Если во втором ряду трехзначное число, то при переходе на умножение сотен для отметки нужно будет два нуля, для умножения тысяч – 3 и так далее.

А как быть с числами со знаком?

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

Перевод чисел из двоичной в шестнадцатеричную систему и наоборот.

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

Таблица тетрад для перевода.

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

Двоичная СС

Восьмеричная СС

000

001

1

010

2

011

3

100

4

101

5

110

6

111

7

Пример перевода из шестнадцатеричной системы в двоичную: A5E16 = 1010 0101 1110 = 1010010111102

Пример перевода из двоичной системы в шестнадцатеричную: 1111001112 = 0001 1110 0111 = 1E716

В этом примере количество цифр в исходном двоичном числе не было равным четырём (9), поэтому были добавлены незначащие нули — общее число цифр стало 12.

Автоматический перевод. Быстрый перевод из шестнадцатеричной системы счисления в одну из трёх популярных систем (двоичную, восьмеричную и десятичную), как и обратный перевод, можно выполнить, используя стандартный калькулятор из комплекта поставки ОС Windows. Откройте калькулятор, выберите в меню Вид -> Программист. В данном режиме можно устанавливать систему счисления, используемую в данный момент (см. меню слева: Hex, Dec, Oct, Bin). При этом изменение текущей системы счисления автоматически производит перевод.

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

Способ 1:

Каждый разряд восьмеричного числа будем делить на 2 и записывать остатки в обратном порядке, формируя группы по 3 разряда двоичного числа. Если в группе получилось меньше 3 разрядов, тогда дополняем нулями. Записываем все группы по порядку, отбрасываем ведущие нули, если имеются, и получаем двоичное число.

Возьмем число 438.
Делим последовательно 4 на 2 и получаем остатки 0,0,1. Записываем их в обратном порядке. Получаем 100.
Делим последовательно 3 на 2 и получаем остатки 1,1. Записываем их в обратном порядке и дополняем ведущими нулями до трех разрядов. Получаем 011.
Записываем вместе и получаем 1000112

Способ 2:

Используем таблицу триад:

Цифра1234567
Триада000001010011100101110111

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

3518 = (011) (101) (001) = 0111010012 = 111010012

Шаги

Метод 1 из 2:

Основы двоичной системы

1

Ознакомьтесь с основами двоичной системы. Система счисления, которой мы ежедневно пользуемся, называется десятичной, потому что она включает десять цифр (от 0 до 9). В двоичной системе счисления используются всего две цифры — 0 и 1.

2

Прибавьте единицу, изменив последний 0 на 1. Если двоичное число заканчивается на 0, измените этот 0 на 1, чтобы прибавить к данному числу единицу. Это аналогично сложению первых двух чисел:
0 = ноль
1 = один
Если двоичное число состоит из нескольких цифр, учитывайте только последний 0: 101 + 1 = 1011.

3

Припишите к двоичному числу еще одну цифру, если оно состоит только из единиц. Итак, мы получили 1 для единицы, но цифр больше нет. Чтобы посчитать до двух, напишите еще одну цифру. Припишите 1 слева от двоичного числа, а все остальные цифры этого числа сделайте нолями.
0 = ноль
1 = один
10 = два
Аналогичное правило используется в десятичной системе счисления, когда больше нет цифр, например, 9 + 1 = 10. В двоичной системе такое случается гораздо чаще, потому что в ней используются всего две цифры.

4

Воспользуйтесь описанными правилами, чтобы посчитать до пяти. Попробуйте сделать это самостоятельно, а потом проверьте результат:
0 = ноль
1 = один
10 = два
11 = три
100 = четыре
101 = пять

5

Посчитайте до шести.110 = шесть Теперь необходимо найти результат сложения 5+1 в двоичной системе, а именно сложить двоичные числа 101 + 1. Правило заключается в том, что нужно проигнорировать первую цифру. Таким образом, сложите 1 + 1, чтобы получить 10 (это цифра 2 в двоичной системе). Теперь восстановите первую цифру и получите:

6

Сосчитайте до десяти. Все правила уже описаны; других правил нет. Попробуйте сосчитать до десяти, а потом проверьте результат:
110 = шесть
111 = семь
1000 = восемь
1001 = девять
1010 = десять

7

Научитесь добавлять новые цифры

Обратите внимание, что десять (1010) не является каким-то особенным числом в двоичной системе. Сейчас нас больше интересует число восемь

Восемь (1000) равно 2 x 2 x 2 (10 х 10 х 10). Умножайте числа на два (10), чтобы находить другие числа, например, шестнадцать (10000) и тридцать два (100000).

8

Попрактикуйтесь в нахождении больших чисел. Теперь вы знаете все правила, необходимые для счета в двоичной системе. Если вы запутались, вспомните, что нужно делать с последними цифрами. Вот несколько примеров:
Двенадцать плюс один = 1100 + 1 = 1101 = тринадцать (0 + 1 = 1, а остальные цифры не меняются).
Пятнадцать плюс один = 1111 + 1 = 10000 = шестнадцать (цифр больше нет, поэтому слева от 1111 мы приписываем 1, а все остальные цифры превращаем в ноли).
Сорок пять плюс один = 101101 + 1 = 101110 = сорок шесть (1 + 1 = 10, а остальные цифры не меняются).

Метод 2 из 2:

Как преобразовать двоичное число в десятичное

  1. 1

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

    • 1 — это разряд единиц;
    • 1 0 — это разряд двоек;
    • 1 00 — это разряд четверок;
    • 1 000 — это разряд восьмерок.
  2. 2

    Умножьте каждую цифру двоичного числа на соответствующий разряд. Начните с крайней правой цифры — она стоит в разряде единиц, поэтому ее нужно умножить на 1; на следующей строке умножьте вторую справа цифру на 2; на следующей строке умножьте третью справа цифру на 4 и так далее. Например:

    • Преобразуйте двоичное число 10011 в десятичное.
    • Первая справа цифра 1. Она находится в разряде единиц. Поэтому умножьте ее на единицу: 1 x 1 = 1.
    • Вторая справа цифра тоже 1. Она находится в разряде двоек. Поэтому умножьте ее на два: 1 x 2 = 2.
    • Следующая цифра 0. Умножьте ее на четыре: 0 x 4 = 0.
    • Следующая цифра тоже 0. Умножьте ее на восемь: 0 x 8 = 0.
    • Последняя (справа) цифра 1. Умножьте ее на шестнадцать: 1 x 16 = 16.
  3. 3

    Сложите полученные результаты. Вы преобразовали каждую цифру двоичного числа в цифру десятичной системы. Чтобы найти десятичное число, сложите все полученные значения. В нашем примере:

    • 1 + 2 + 16 = 19.
    • Таким образом 10011 (в двоичной системе) = 19 (в десятичной системе).

Преобразование чисел

Для преобразования из двоичной системы в десятичную используют следующую таблицу степеней основания 2:

10245122561286432168421

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

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

Допустим, дано двоичное число 1100012. Для перевода в десятичное запишите его как сумму по разрядам следующим образом:

То же самое чуть иначе:

Можно записать это в виде таблицы следующим образом:

5122561286432168421
1 1 1
+32+16+0+0+0+1

Двигайтесь справа налево. Под каждой двоичной единицей напишите её эквивалент в строчке ниже. Сложите получившиеся десятичные числа.
Таким образом, двоичное число 1100012 равнозначно десятичному 4910.

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

Нужно перевести число 1011010,1012 в десятичную систему. Запишем это число следующим образом:

То же самое чуть иначе:

Или по таблице:

6432168421 0.50.250.125
1111,1 1
+64+0+16+8+0+2+0 +0.5+0+0.125

Преобразование методом Горнера

Основная статья: Метод Горнера

Для того, чтобы преобразовывать числа из двоичной в десятичную систему данным методом, надо суммировать цифры слева направо, умножая ранее полученный результат на основу системы (в данном случае 2). Методом Горнера обычно переводят из двоичной в десятичную систему. Обратная операция затруднительна, так как требует навыков сложения и умножения в двоичной системе счисления.

Например, двоичное число 10110112 переводится в десятичную систему так:

То есть в десятичной системе это число будет записано как 91.

Перевод дробной части чисел методом Горнера

Цифры берутся из числа справа налево и делятся на основу системы счисления (2).

Например 0,11012

Ответ: 0,11012= 0,812510

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

Допустим, нам нужно перевести число 19 в двоичное. Вы можете воспользоваться следующей процедурой :

Итак, мы делим каждое частное на 2 и записываем остаток в конец двоичной записи. Продолжаем деление до тех пор, пока в частном не будет 0. Результат записываем справа налево. То есть нижняя цифра (1) будет самой левой и т.д. В результате получаем число 19 в двоичной записи: 10011.

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

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

  • Дробь умножается на основание двоичной системы счисления (2);
  • В полученном произведении выделяется целая часть, которая принимается в качестве старшего разряда числа в двоичной системе счисления;
  • Алгоритм завершается, если дробная часть полученного произведения равна нулю или если достигнута требуемая точность вычислений. В противном случае вычисления продолжаются над дробной частью произведения.

Пример: Требуется перевести дробное десятичное число 206,116 в дробное двоичное число.

Перевод целой части дает 20610=110011102 по ранее описанным алгоритмам. Дробную часть 0,116 умножаем на основание 2, занося целые части произведения в разряды после запятой искомого дробного двоичного числа:

Таким образом 0,11610 ≈ 0,00011101102

Получим: 206,11610 ≈ 11001110,00011101102

Прямой код

Прямой код используется в двух вариантах.В первом (основной) — для записи только неотрицательных чисел:

В этом варианте (для восьмибитного двоичного числа) мы можем записать максимальное число 255 (всего чисел 256 — от 0 до 255)

Второй вариант — для записи как положительных, так и отрицательных чисел.В этом случае старший бит (в нашем случае — восьмой) объявляется знаковым разрядом (знаковым битом).При этом, если: — знаковый разряд равен 0, то число положительное — знаковый разряд равен 1, то число отрицательное

В этом случае диапазон десятичных чисел, которые можно записать в прямом коде составляет от — 127 до +127:

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

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

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

Целую часть числа переводится из десятичной СС в другую систему счисления — последовательным делением целой части числа на основание системы счисления (для двоичной СС — на 2, для 8-ичной СС — на 8, для 16-ичной — на 16 и т.д.) до получения целого остатка, меньше, чем основание СС.

Пример 4. Переведем число 159 из десятичной СС в двоичную СС:

1592      
158792     
178392    
 138192   
  11892  
   1842 
    1422
     21

Рис. 1

Как видно из Рис. 1, число 159 при делении на 2 дает частное 79 и остаток 1. Далее число 79 при делении на 2 дает частное 39 и остаток 1 и т.д. В результате построив число из остатков деления (справа налево) получим число в двоичной СС: 10011111. Следовательно можно записать:

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

6158  
608768 
77298
 481
  1 

Рис. 2

При приведении числа из десятичной СС в восьмеричную СС, нужно последовательно делить число на 8, пока не получится целый остаток меньшее, чем 8. В результате построив число из остатков деления (справа налево) получим число в восьмеричной СС: 1147(см. Рис. 2). Следовательно можно записать:

Пример 6. Переведем число 19673 из десятичной системы счисления в шестнадцатеричную СС.

1967316  
19664122916 
912167616
 13644
  12 

Рис. 3

Как видно из рисунка Рис.3, последовательным делением числа 19673 на 16 получили остатки 4, 12, 13, 9. В шестнадцатеричной системе счисления числе 12 соответствует С, числе 13 — D. Следовательно наше шестнадцатеричное число — это 4CD9.

Далее рассмотрим перевод правильных десятичных дробей в двоичную СС, в восьмеричную СС, в шестнадцатеричную СС и т.д.

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

Рассмотрим вышеизложенное на примерах.

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

  0.214
 x2
 0.428
 x2
 0.856
 x2
1 0.712
 x2
1 0.424
 x2
 0.848
 x2
1 0.696
 x2
1 0.392

Рис. 4

Как видно из Рис.4, число 0.214 последовательно умножается на 2. Если в результате умножения получится число с целой частью, отличное от нуля, то целая часть записывается отдельно (слева от числа), а число записывается с нулевой целой частью. Если же при умножении получиться число с нулевой целой частью, то слева от нее записывается нуль. Процесс умножения продолжается до тех пор, пока в дробной части не получится чистый нуль или же не получим требуемое количество разрядов. Записывая жирные числа (Рис.4) сверху вниз получим требуемое число в двоичной системе счисления: 0.0011011.

Следовательно можно записать:

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

  0.125
 x2
 0.25
 x2
 0.5
 x2
1 0.0

Рис. 5

Для приведения числа 0.125 из десятичной СС в двоичную, данное число последовательно умножается на 2. В третьем этапе получилось 0. Следовательно, получился следующий результат:

Пример 9. Переведем число 0.214 из десятичной системы счисления в шестнадцатеричную СС.

  0.214
 x16
3 0.424
 x16
6 0.784
 x16
12 0.544
 x16
8 0.704
 x16
11 0.264
 x16
4 0.224

Рис. 6

Следуя примерам 4 и 5 получаем числа 3, 6, 12, 8, 11, 4. Но в шестнадцатеричной СС числам 12 и 11 соответствуют числа C и B. Следовательно имеем:

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

  0.512
 x8
4 0.096
 x8
 0.768
 x8
6 0.144
 x8
1 0.152
 x8
1 0.216
 x8
1 0.728

Рис. 7

Получили:

Пример 11. Переведем число 159.125 из десятичной системы счисления в двоичную СС. Для этого переведем отдельно целую часть числа (Пример 4) и дробную часть числа (Пример 8). Далее объединяя эти результаты получим:

Пример 12. Переведем число 19673.214 из десятичной системы счисления в шестнадцатеричную СС. Для этого переведем отдельно целую часть числа (Пример 6) и дробную часть числа (Пример 9). Далее объединяя эти результаты получим:

Об этой статье

Соавтор(ы):
Штатный редактор wikiHow

В создании этой статьи участвовала наша опытная команда редакторов и исследователей, которые проверили ее на точность и полноту. wikiHow тщательно следит за работой редакторов, чтобы гарантировать соответствие каждой статьи нашим высоким стандартам качества. Количество просмотров этой статьи: 12 395.

Категории: Математика

English:Multiply

Français:multiplier

Español:multiplicar

Português:Multiplicar

Nederlands:Vermenigvuldigen

Italiano:Moltiplicare i Numeri Interi

Bahasa Indonesia:Menghitung Perkalian

العربية:القيام بعملية الضرب

ไทย:คูณ

हिन्दी:गुणा (Multiply) करें

Печать

Сложение

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

Правила сложения двоичных чисел:

0 + 0 = 0

0 + 1 = 1

1 + 1 =10

Например, сумма двоичных чисел 1000111 + 110011 = 1111010

Первое слагаемое

1

1

1

1

Второе слагаемое

1

1

1

1

Сумма

1

1

1

1

1

На примере видно, как происходит перенос в старший разряд. При сложении единиц самого младшего разряда получается 10. Ноль остается на своем месте, а единица переносится в старший разряд слева, где уже складываются две единицы. Получается 11. И снова, младшую единицу оставляют, а старшую переносят влево.

Деление

Операция деления выполняется столбиком, аналогично как в десятичной системе счисления.

Рис. 2. Деление двоичных чисел

Всегда можно проверить результаты двоичной арифметики с помощью калькулятора. Считать можно и в двоичном формате. Электронный калькулятор в группе стандартных приложений операционной системы MS Windows имеет такой режим работы.

Рис. 3. Режим Программист электронного калькулятора ОС Windows

Что мы узнали?

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

Шестнадцатеричная система счисления.

Шестнадцатеричная система счисления (шестнадцатеричные числа) — позиционная система счисления. Основанием шестнадцатеричной системы счисления  является число 16.

Записывая числа в восьмеричной системе счисления мы получаем довольно компактные выражения, однако в шестнадцатеричной системе мы получаем выражения более компактными.

Первыми десятью цифрами из шестнадцати шестнадцатеричных цифрах является стандартный интервал 0 — 9, последующие шесть цифр выражают при помощи первых букв латинского алфавита: A, B, C, D, E, F. Перевод из шестнадцатеричной системы в двоичную систему и в обратную сторону делают аналогично процессу для восьмеричной системы.

Об этой статье

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 25 человек(а). Количество просмотров этой статьи: 10 375.

Категории: Математика

English:Divide Binary Numbers

Español:dividir números binarios

Português:Dividir Números Binários

Deutsch:Division mit Binärzahlen

Français:diviser des nombres binaires

Bahasa Indonesia:Membagi Bilangan Biner

Nederlands:Binaire getallen delen

العربية:قسمة الأعداد الثنائية

中文:做二进制数的除法运算

Печать

А что она счет большей разрядности?

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

Сначала отмечу особенности результатов деления. Частное может занимать столько же разрядов, сколько делимое. Действительно, если мы
делим на единицу, то частное будет равно делимому. А вот остаток всегда меньше делителя. Значит, частное у нас тоже будет
16-разрядным, как и делимое. Остаток будет 8-разрядным, как и делитель.

На первый взгляд, изменения в программе будут минимальны. Достаточно в счетчик загрузить 16, на втором шаге сдвигать не два, а три байта,
сдвиг частного будет затрагивать два байта.
И все должно заработать. Но давайте посмотрим, что может быть когда все 8 разрядов делителя являются значащими. То есть,
старший разряд делителя равен единице (делитель больше 128, 10000000 в двоичном виде). А может возникнуть ситуация, когда на
очередной итерации цикла текущее значение остатка будет тоже содержать единицу в старшем разряде, но разность окажется отрицательной.
Например, текущее значение остатка 10110011, а делитель 11001100. Это не страшно, если мы уже обработали все разряды (счетчик
обнулился), тогда текущее значение остатка просто будет остатком от деления. Но если деление еще не закончено, то на следующей итерации
у нас текущий остаток выйдет за границы байта, что недопустимо. При 8-разрядном делимом такого произойти не могло. Подумайте почему.
Придется учитывать эту тонкость. На сам алгоритм это не повлияет, но шаг 3 немного усложнится. А теперь получившаяся программа

    ;
    ; Секция данных процедуры деления.
    ;
    div_dat  udata_shr
    dividend      res      2   ; делимое, два байта
                               ; старший байт делимого будет
                               ; находиться по адресу
                               ; dividend+1
    divider       res      1   ; делитель, один байт
    quotient      res      2   ; частное, два байта
    remainder     res      1   ; остаток, один байт
    counter       res      1   ; счетчик сдвигов/вычитаний

    ;
    ; Секция кода процедуры деления.
    ;
    Division code

    Udiv16x8:
    
    ; Шаг 1, инициализация счетчика
            movlw    .16
            movwf    counter            ; Всегда обрабатываем все биты 
            
    ; Шаг 2, перенос очередного разряда делимого в остаток
    Step2:
            rlf      dividend,f
            rlf      dividend+1,f
            rlf      remainder,f
    
    ; Шаг 3, вычитание и определение значения очередного разряда частного
    ; *** в этом месте флаг переноса у нас 1, если текущий остаток вышел
    ;     за границы байта. Этот случай мы должны обрабатывать отдельно
            btfsc    STATUS,C
            goto     Step3a             ; на обработку особого случая
            movf     divider,w
            subwf    remainder,w
            btfss    STATUS,C
            goto     Negate
            rlf      quotient,f
            rlf      quotient+1,f
            movwf    remainder
            goto     Step4
    Step3a:
            movf     divider,w
            subwf    remainder,f        ; разность всегда положительна
            bsf      STATUS,C
    Negate:
            rlf      quotient,f
            rlf      quotient+1,f
            
    ; Шаг 4, проверка завершения деления
    Step4:
            decfsz   counter,f
            goto     Step2
            return

На шаге 3 появилась проверка выхода остатка за границу байта, это можно определить по состоянию флага переноса, куда
выдвигается старший разряд. А обработка этого случая выполняется на шаге 3а. Не смотря на то, что операция вычитания
не учитывает выход уменьшаемого (остатка) за границу байта, ее результат будет правильным в пределах байта.
Можете проверить сами. А вот знак разности будет ошибочным, что мы и исправляем принудительной установкой флага переноса.
Размер программы увеличился незначительно. Увеличился и занимаемый размер памяти данных, что естественно.

Программы можно немного оптимизировать по размеру не увеличивая время выполнения. Например, можно заметить, что сдвиги частного
выполняются в двух местах (для двух случаев), при этом они совершенно идентичны. Можно оставить сдвиг только в одном месте, если
учесть, что команда movwf не изменяет состояние флага переноса. Попробуйте сделать эту оптимизацию самостоятельно, я не стал
ее делать для сохранения большей наглядности. Но в программе деления 16-разрядного числа на 8-разрядное такая оптимизация
частично есть (иначе сдвиг частного был бы трех местах).

Заключение

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

Отмечу преимущество нашей реализации деления перед операцией деления в языках высокого уровня — мы сразу получаем и частное, и остаток. Да,
в stdlib есть функция div, которая тоже позволяет получить и частное, и остаток (структура div_t). Но, во первых, не
во всех компиляторах эта библиотека доступна. Во вторых, посмотрите на такую шедевральную, иначе и не скажешь реализацию
функции div в одном из компиляторов для 8-разрядных микроконтроллеров PIC

    div_t div(signed int numer, signed int denom) {
        div_t val;
        val.quot = numer / denom;
        val.rem = numer - (denom * val.quot);
        return (val);
    }

В 8 разрядных PIC команды деления нет, значит оно выполняется только программно. Как мы видели, при этом получается и частное,
и остаток. Но в этой реализации остаток предпочитают получать еще раз, причем через умножение! Замечу, что команда умножения есть
не во всех 8 разрядных PIC. Я не буду называть компилятор и его производителя. Но замечу, что это коммерческий компилятор, и
совсем не дешевый. Поэтому, знать описанные в этой статье алгоритмы деления может быть полезно даже в том случае, если Вы используете другие
контроллеры и всегда пишете программы только на языках высокого уровня.

Оцените статью:
Оставить комментарий
Adblock
detector