@Danilka2400

Как из массива байтов HEX сделать сделать DEC?

Даны массивы:

byte skoll[]  = {0x40, 0x42, 0x0F, 0x00, 0x00, 0x00}; // хранит количество DEC = 1 000 000, то есть одна штука

byte sPrice[] = {0x04, 0x02, 0x00, 0x00, 0x00};// хранит цену DEC =516 ( то есть 5.16 рублей)

Нужно сделать так, чтобы skoll*sPrice=summ, а summ - новый массив - также разбит по байтам.

UPD:
Смог в DEC то и то перевести, остался вопрос как вернуть как было в новый массив:

word x = 0;
        word y = 0;
        word s=0;
        for(int i = 5; i >= 0; i--) {
          x = x*256+skoll[i];
        }
        x=x/1000000; // количество
        Serial.println(x);

        for(int i = 4; i >= 0; i--) {
          y = y*256+sPrice[i];
        }
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
как вернуть как было в новый массив

byte summ[N];
word s = x * y;

for (i = 0; i < N; ++i) {
    summ[i] = s % 256;
    s /= 256;
}
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Можно без перевода в десятичную систему считать. Столбиком, как в начальной школе. Это будет работать даже если ваши числа длиннее 4 байт.
byte summ[N];  // N >= skoll_len+sprice_len.
for (int i = 0; i < skoll_len; ++i ) {
  word carry = 0;
  for (int j = 0; j < sprice_len; ++j) {
    carry += summ[i+j] + (word)skoll[i] * sPrice[j];
    summ[i+j] = carry % 256;
    carry /= 256;
  }
  if (carry > 0)
    summ[x_len + y_len - 1] += carry;
}


Тут три неочевидных момента. При прибавлении одной строки из умножения столбиком все переносы считаются сразу одним проходом. Во-вторых, там может быть какой-то лишний перенос в конце, но только на одну дополнительную ячейку, потому что x < 256^x_len, y <256^x_len, а значит x*y < 256^(x_len+y_len), значит не будет никакой записи дальше ячейки x_len+y_len-1. И последнее, carry по пути нигде ни разу не переполнится, ибо максимальная сумма там может быть 255*255+255+255 < 256*256.

P.s. Но если у вас числа уж очень длинные, то гуглите быстрое преобразование фурье + длинное умножение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы