В лабраторной работе реализованно 6 потоков Потоки вызываются рекурсивно каждый поток представляет собой выполнение метода Stage в каждом потоке у нас 3 операции (промежуточное порозрядное умножения для каждого из чисел) так как операции выполняются за разное время, а операция 2 потока 2 не может начаться пока операция 2 потока 1 не закончится так как зависит от результатов её выполнения введены маркеры измениния для каждой пары чисел и они храняться в массиве change[3]
новый поток необходимо создавать только после выполнения первой операции в потоке (на следующих операциях не нужно) для отслеживания этого был введён флаг index
все промежуточные ответы как и конечный храняться в векторе tempAnswer[3]
само умножение построенно на методе stageOfMultiplication который в зависимости от стадии умножения делает нужный сдвиг в новом слагаемом а затем складывает с предыдущем ответом ВНИМАНИЕ stageOfMultiplication заточена под 6 разрядные числа если передать стадию большей разрядности метод отработает некоректно
метод boolSum выполняет поразрядное сложение предоставленных ему двоичных чисел
методы fromIntToBool и fromBoolToInt выполняют перевод их десятичной системы в двоичнную и наоборот соответсвенно