четверг, 7 февраля 2019 г.

Как за одно сложение сложить несколько небольших чисел?

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

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

Для примера приведу код разделения 32-битного числа на 4 8-ми битных, со сложением 4-х 8-ми битных за одно сложение 32-битного:
#include 
#include 

union FourNumbers
{
  int nValue32;
  unsigned char nValue8[4];
};

int main(int argc, char** argv)
{
  FourNumbers a;
  a.nValue8[0] = 1;
  a.nValue8[1] = 2;
  a.nValue8[2] = 3;
  a.nValue8[3] = 4;

  FourNumbers b;
  b.nValue8[0] = 5;
  b.nValue8[1] = 6;
  b.nValue8[2] = 7;
  b.nValue8[3] = 8;

  FourNumbers c;

  // execute only one add operation
  c.nValue32 = a.nValue32 + b.nValue32;
  printf("0: %d, 1: %d, 2: %d, 3: %d\n", 
    c.nValue8[0], c.nValue8[1], 
    c.nValue8[2], c.nValue8[3]);

  // output is
  // 0: 6, 1: 8, 2: 10, 3: 12

  return 0;
};

Комментариев нет:

Отправить комментарий