Столкнулся с ситуацией, когда в одной операции надо было использовать одновременно несколько множеств чисел, но так, чтобы они не пересекались и операции выполнялись над параллельными множествами. Оказалось, что да, можно так сделать для операций сложения, если числа помещать в разные разряды. Попробуем разобраться.
Если разместить в одних разрядах одни числа, а в другие, то при сложении они будут складываться между собой параллельно. Скажем, если есть рубли и копейки, то пока сумма копеек не превышает рубля (ограничение на кодирование копеек), рубли складываются между собой, а копейки между собой.
Для примера приведу код разделения 32-битного числа на 4 8-ми битных, со сложением 4-х 8-ми битных за одно сложение 32-битного:
Если разместить в одних разрядах одни числа, а в другие, то при сложении они будут складываться между собой параллельно. Скажем, если есть рубли и копейки, то пока сумма копеек не превышает рубля (ограничение на кодирование копеек), рубли складываются между собой, а копейки между собой.
Для примера приведу код разделения 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; };
Комментариев нет:
Отправить комментарий