Как я могу сделать арифметику для чисел с нестандартным двоичным представлением? - PullRequest
0 голосов
/ 06 марта 2012

С неподписанным символом вы можете сохранить число от 0 до 255

255 (b10) = 11111111 (b2) <=это 1 байт </p>

Это упростит предварительные операции, такие как +, -, * ...

А теперь как насчет:

255 (b10) = 10101101 (b2)

Следуя этому методу, можно представить до 399 с использованием беззнакового символа?

399 (b10) = 11111111 (b2)

Может ли кто-нибудь предложить алгоритм добавления преформ с использованием последнего метода?

Ответы [ 4 ]

5 голосов
/ 06 марта 2012

С восемью битами возможны только 256 значений (2 8 ), независимо от того, как вы их нарезаете и нарезаете.

Ваша схема кодирования цифр в 2-3-3форма, такая как:

255 = 10 101 101
399 = 11 111 111

игнорирует тот факт, что эти трехбитовые последовательности могут представлять только восемь значений (0-7), а не десять (т. е. этот второй будет377, а не 399).

Компромисс заключается в том, что это означает, что вы получаете числа '25[6-7]' (2 значения) '2[6-7][0-7]' (16 значений) и '3[0-7][0-7]' (64значения) в общей сложности 82 значения.

Ваша жертва для этого усиления заключается в том, что вы больше не можете представлять любые числа, содержащие 8 или 9: '[8-9]' (2 значения), '[1-7][8-9]' (14 значений), '[8-9][0-9]' (20 значений), '1[0-7][8-9]' (16 значений), '1[8-9][0-9]' (20 значений) или '2[0-4][8-9]' (10 значений), всего 82 значения.

Баланс (82 против 82) показывает, что для восьмибитного типа данных все еще есть только 256 возможных значений.

Таким образом, ваша схема кодирования основана на ошибочной предпосылке, которая делаетсБоюсь, вторая часть вашего вопроса (как их добавить) не имеет значения.

2 голосов
/ 06 марта 2012
Тип

A unsigned char может содержать только математические значения от 0 до 255, как определено правилом 2^n - 1 для максимального значения без знака, которое может представлять количество бит n.Нет никакого способа «улучшить» диапазон символов, вы, вероятно, захотите использовать unsigned short, который содержит два байта.

0 голосов
/ 06 марта 2012

То, что вы хотите сделать, математически невозможно. Вы можете представить только 256 дискретных значений с 8 логическими значениями.

Чтобы проверить это, составьте таблицу всех возможных значений, в десятичном и двоичном виде. * Т.е. 1003 *

000 = 00000000
001 = 00000001
002 = 00000010
003 = 00000011
004 = 00000100

...

254 = 11111110
255 = 11111111

Вы увидите, что после 255 вам потребуется девятый бит.

Вы можете разрешить 255 = 10101101, но если вы будете работать в обратном направлении от этого, у вас кончится, прежде чем вы достигнете 0.

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

0 голосов
/ 06 марта 2012

Вы ошибаетесь.

В вашей схеме 255 будет 010101101, что составляет 9 бит. Ведущий ноль важен. Я предполагаю, что здесь вы используете нечто, похожее на восьмеричное представление. 3 бита / цифра. Любая другая альтернатива означает, что вы не можете представить все остальные цифры.

|0|000|
|1|001|
|2|010|
|3|011|
|4|100|
|5|101|
|6|110|
|7|111|
|8|???|
|9|???|

9 в двоичном виде - 1001. Таким образом, вы не можете использовать 3 бита на цифру. Вам нужно использовать 4 бита, если вы хотите представить 8 и 9. Опять же, я пытаюсь предположить, что вы кодируете каждую цифру отдельно. Итак, 399 по вашему мнению будет: 001110011001 - 12 бит. Для сравнения, двоичный код делает 399 в 110001111 - 9 бит.

Таким образом, двоичный код является наиболее эффективным, поскольку кодирование цифр от 0 до 9 в вашей системе означает, что максимальное число, которое вы можете хранить без потери информации в 8 битах, составляет 99 - 10011001:)

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

Если вы действительно хотите сжать количество битов, необходимое для представления числа, то на самом деле вам нужно какое-то сжатие, а не способ двоичного кода.

...