, чтобы вы могли обмануть и просто иметь таблицу поиска (есть еще более простой обман). Но правильный способ - просто выполнить математику. Вам нужно преобразовать из базы 2 или с технической базы 16 в базу 10. Вы можете легко перемещаться от основания 2 к основанию 8 (восьмеричное) к основанию 16 (шестнадцатеричное) с помощью только бит-манипуляции, потому что 8 и 16 имеют степень 2. Но 10 не является силой 2, вы не можете сделать это с помощью бит-манипуляции.
То, с которым мы больше знакомы, - это временная база 60 часов в минутах. 1 час - 60 минут, одна минута - 60 секунд, так сколько часов - 4321 секунд? как вы решаете это? сколько секунд в час? 60 * 60 = 3600 право? два часа составляет 7200 секунд, поэтому 4321 находится где-то между одним и до, точно это 4321/3600 или 1 остаток 721. или 1 час 721 секунд. сколько минут за 721 секунд? 721/60 = 12 остатков 1, поэтому 4321 секунда составляет 1 час 12 минут 1 секунду. только для проверки 3600 * 1 + 12 * 60 + 1 = 4321. или (60^2) * 1 + (60^1) * 12 + (60^0) * 1 - 4321.
Что относительно 0x1234 до десятичной? наш калькулятор говорит нам 4660. Короткий ответ - это ваш путь вниз с полномочиями 10, которые на или выше числа. поэтому 16-битное число не может быть больше 65535, поэтому 10000-е место или 10^4. 0x1234/10000 = 0 остаток 0x1234. возьмите остаток 0x1234/1000 = 4 остаток 0x294 (660), возьмите остаток 0x294/100 = 6 остаток 0x3C (60), возьмите остаток 0x3C/10 = 6 остаток 0, возьмите остаток 0/1 = 0. возьмите все Факторы 04660, поэтому ответ равен 4660 десятичным.
Таким образом, буква B является номером ascii 0x42, нижний регистр 0x62, поэтому вы должны быть осторожны. 0x42 - 0xB = 0x37.
Таким образом, вычитая 0x30 из символов ascii 0-9, вы получите число 0 - 9. Но если вы знаете/предполагаете, что это (шестнадцатеричное) число и оно больше 0x39, то вместо этого вычесть 0x37. 0x42 - 0x37 = 0xB, 0x62 - 0x37 = 0x2B, вы можете и с 0xF и очистить это для верхнего и нижнего регистров.
4 бита наибольшее число - 15, поэтому для преобразования из базы 2/16 в базу 10 нам нужно иметь дело только с 10^1 и 10^0. так что 0xB/10 = 1 остаток 1 1/1 = 1, принимают коэффициенты 0xB = 11 десятичных знаков.
Простейший чит здесь, если ваши входы ограничены между 0xA и 0xF, что составляет от 10 до 15. Вы знаете, что все числа, деленные на 10, составляют 1 остаток от 0 до 5. поэтому просто вычитайте 10, и вы получите 0 до 5.
Следующая проблема: вы принимаете 0x42 (символ B) и вычитаете 0x30, то есть 0x12, устройство, управляющее устройством на диаграмме ascii, в принципе не имеет смысла пытаться использовать int21 ah = 2 с этим символом. чтобы распечатать номер 11, вам нужно напечатать 0x31, а затем еще 0x31. если ваш вход F был ответом 15, вы отправляете 0x31 и 0x35. чит должен взять 0x46 ваш вход ('F'), вычесть 0x37, чтобы получить 0xF, затем вычесть 10, чтобы получить 0x5, напечатать 0x31 для 10, затем добавить 0x30 в 0x5, чтобы получить 0x35, и напечатать это. вы можете комбинировать вычитание 0x37 и 10 с 0x41.
'A' = 0x41, 0x41 - 0x41 = 0x00, 0x00+0x30 = 0x30 = '0'
'B' = 0x42, 0x42 - 0x41 = 0x01, 0x01+0x30 = 0x31 = '1'
'C' = 0x43, 0x43 - 0x41 = 0x02, 0x02+0x30 = 0x32 = '2'
'D' = 0x44, 0x44 - 0x41 = 0x03, 0x03+0x30 = 0x33 = '3'
'E' = 0x45, 0x45 - 0x41 = 0x04, 0x04+0x30 = 0x34 = '4'
'F' = 0x46, 0x46 - 0x41 = 0x05, 0x05+0x30 = 0x35 = '5'
или еще более оптимизированы для ваших конкретных пределов входных
'A' = 0x41, 0x41 - 0x11 = 0x30 = '0'
'B' = 0x42, 0x42 - 0x11 = 0x31 = '1'
'C' = 0x43, 0x43 - 0x11 = 0x32 = '2'
'D' = 0x44, 0x44 - 0x11 = 0x33 = '3'
'E' = 0x45, 0x45 - 0x11 = 0x34 = '4'
'F' = 0x46, 0x46 - 0x11 = 0x35 = '5'
вы можете пойти так далеко, чтобы ограничить проверку и, если входной символ меньше, чем 0x41 или больше 0x46 может быть, выход A '?' (0x3F) вместо числового ответа.
так что ваше преобразование неверно двумя способами: сначала вы забываете, что для вывода чисел между 10 и 15 секундами требуется два символа, результат вашей математики должен быть символом, который имеет смысл (между 0x30 и 0x35)