_pv 79 5 сентября, 2022 Опубликовано 5 сентября, 2022 · Жалоба 4 hours ago, Intel4004 said: unsigned char data_0_99 = (data1[4] - 0x30) * 10 + data1[5] - 0x30; unsigned char data_0_255 = (data_0_99*256+100/2)/100; // если 0..100 -> 0..256 unsigned char data_0_255 = (data_0_99*255+99/2)/99; // если 0..99 -> 0..255 В 16 бит вписывается. А со сдвигами лучше пока не заморачиваться, со временем само придет. Компилятор сам *256 превратит в <<8, если оно будет оптимальнее. на умножение со сдвигами можно и не заморачиваться, а вот на деление - совсем другое дело, там пара сотен тактов выйдет вместо взятия старшего байта, поэтому домножить всё и внутри скобок и делитель на 256/100. тогда и получится ((data[4]-'0')*6554+(data[5]-'0')*655 + 128) >> 8 и у ТС вроде как раз третий случай 0..100 -> 0..255 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 5 сентября, 2022 Опубликовано 5 сентября, 2022 · Жалоба 5 часов назад, Intel4004 сказал: unsigned char data_0_99 = (data1[4] - 0x30) * 10 + data1[5] - 0x30; unsigned char data_0_255 = (data_0_99*256+100/2)/100; // если 0..100 -> 0..256 unsigned char data_0_255 = (data_0_99*255+99/2)/99; // если 0..99 -> 0..255 В 16 бит вписывается. А команда деления в системе команд CPU ТС-а имеется? И какой разрядности? Вам известно? Без неё ваш вариант будет безбожно тормозить - как бы не в несколько десятков раз медленнее моего может оказаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 5 сентября, 2022 Опубликовано 5 сентября, 2022 · Жалоба 8 hours ago, jcxz said: А команда деления в системе команд CPU ТС-а имеется? И какой разрядности? Вам известно? Да. 16. Да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться