РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос (честно говоря, я до сих пор не могу точно сказать , где - фактический вопрос в вашем сообщении). Если вопрос «что я должен принимать в качестве параметров и какой тип я должен возвращать?», Возможно, у вас должен быть параметр const T*
или const std::vector<T>&
для ввода и другой для вывода вместо возврата, это позволит избежать владения выделенной памятью. проблемы.
// base case, weave two 8 bit into a 16 bit word.
uint16_t weave(uint8_t a, uint8_t b) {
uint16_t x = a, y = b;
x = (x | (x << 4)) & 0x0F0F;
x = (x | (x << 2)) & 0x3333;
x = (x | (x << 1)) & 0x5555;
y = (y | (y << 4)) & 0x0F0F;
y = (y | (y << 2)) & 0x3333;
y = (y | (y << 1)) & 0x5555;
return x | (y << 1);
}
// most useful way in my opinion
// weave bits from two arrays 'a' and 'b' of size n
// into a pre-allocated vector 'out'
void weave(const char* a, const char* b, char* out, size_t n) {
uint16_t* ret = (uint16_t*) out;
for(size_t i = 0; i != n; ++i) {
ret[i] = weave(a[i], b[i]);
}
}
// template version, for those that like sugar
template<typename OUT, typename IN>
OUT weave(IN a, IN b, size_t n = 1) {
OUT out;
weave((char*) &a, (char*) &b, (char*) &out, sizeof(IN)*n);
return out;
}
DONT забудьте добавить проверки, утверждения и т. Д., Если это входит в рабочий код.