Вектор переплетения бинарных представлений в C ++ - PullRequest
3 голосов
/ 06 апреля 2011

У меня есть шаблонная функция в C ++, называемая weave, которая берет два знака без знака, переплетает их двоичные расширения и возвращает короткое число без знака.Также можно взять два коротких знака без знака и переплетать их двоичные расширения, чтобы вернуть длинный знак без знака.Вот что я написал:

template<class Typeout, class Typein>
Typeout weave(Typein lhs,Typein rhs)
{
//Need to check that Typeout contains enough storage to contain 2*Typein:
assert(sizeof(Typeout)>=2*sizeof(Typein));

Typeout weaved = 0;
for(int k=0;k<sizeof(Typein)*8;k++)
{
    //weave in the kth element of rhs and lhs.
    weaved |=(Typeout(rhs & (Typein)(1<<k)) << k)| (Typeout(lhs & (Typein)(1<<k)) << (k+1));
}
return weaved;
};

Теперь у меня проблемы с объединением векторов.Я хочу написать функцию weave, которая с учетом вектора символов переплетает все их двоичные расширения и возвращает это.Например, учитывая вектор беззнаковых символов длиной 4, он должен переплетать их двоичные расширения и возвращать представление этого.Я хочу, чтобы это работало для векторов длиной более 8 символов, поэтому я больше не могу хранить их в длинных без знака.Я думаю, мне нужно вернуть вектор ??Но я не знаю, как сократить полученное двоичное расширение.

Я новичок в C ++, поэтому, пожалуйста, не стесняйтесь исправлять код или давать мне советы по нему.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 апреля 2011

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос (честно говоря, я до сих пор не могу точно сказать , где - фактический вопрос в вашем сообщении). Если вопрос «что я должен принимать в качестве параметров и какой тип я должен возвращать?», Возможно, у вас должен быть параметр 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 забудьте добавить проверки, утверждения и т. Д., Если это входит в рабочий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...