8 * sizeof (b) - это количество битов, которые могут быть сохранены в 'b' (это целое число без знака, то есть обычно 32 или 64 бита).
Что делает код, так это упаковывает логические значения в векторе 'a', чтобы они стали битами в 'b'.
"* it & 1" обнуляется до 1, если логическое значение в * это ИСТИНА, в противном случае 0. Затем бит сдвигается влево на 32 бита минус 1 минус индекс 'i', то есть сдвигается влево от нуля до 31 бита , Теперь это означает, что первый элемент «a» будет управлять старшим значащим битом в «b» (левый сдвиг 31), второй элемент - вторым старшим значащим битом в «b» (левый сдвиг 30) и т. Д. Обратите внимание, что в C сдвиги являются арифметическими, т.е. независимо от байтов или порядка битов, x << 1 всегда равно x * 2. </p>
Так, например, если в вашем векторе заданы первый и 30-й элементы, к концу дня b должно содержать двоичное число 10000000 00000000 00000000 00000100.