Представление десятичных чисел в двоичном - PullRequest
0 голосов
/ 16 октября 2018

Как мне представить целые числа, например, 23647 в двух байтах, где один байт содержит последние две цифры (47), а другой - остальные цифры (236)?

1 Ответ

0 голосов
/ 16 октября 2018

Это можно сделать несколькими способами.

Один из способов - использовать Двоично-двоичное кодирование (BCD) .Это кодирует десятичные цифры, а не число в целом как двоичное.Упакованная форма помещает две десятичных цифры в байт.Однако значение вашего примера 23647 имеет пять десятичных цифр и не помещается в два байта в BCD.Этот метод будет соответствовать значениям до 9999.

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

upperbyte = 23647 // 100

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

lowerbyte = 23647 % 100

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

upperbyte, lowerbyte = divmod(23647, 100)

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


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

Один из способов сделать это - «сдвинуть» число, чтобы вы рассматривали эти два байта как одно целое число.

Возьмите свое значение (36,47), умножьте его на 256 (количество значений, помещающихся в один байт), округлите до ближайшего целого числа, преобразовайте в двоичное.Нижние 8 битов этого значения представляют собой «десятичные числа», а следующие 8 битов представляют собой «целочисленное значение».Если все еще остались какие-то другие биты, ваше число было слишком большим и возникло условие переполнения.

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

Выполнение этих вычислений в 36.47 дает двоичное целое число

10010001111000

Таким образом, десятичный байт"равно 01111000 и" целочисленный байт "равен 100100 или 00100100 при заполнении до 8 бит.Это точно представляет число с плавающей точкой 36.46875 и желаемое значение 36.47 приблизительно.

...