Сочетание двух битовых последовательностей - PullRequest
2 голосов
/ 02 апреля 2010

Есть ли какой-нибудь умный способ смешать две битовые последовательности таким образом, чтобы биты из первой последовательности были в нечетных местах, а биты из второй последовательности были в четных местах. Обе последовательности не длиннее 16b, поэтому выходные данные помещаются в 32-разрядное целое число.

Пример:

First sequence  : 1   0   0   1   0   0  
Second sequence :   1   1   1   0   1   1  
Output          : 1 1 0 1 0 1 1 0 0 1 0 1

Я думал о создании целочисленного массива размером 2 ^ 16, и тогда результат будет:

arr[first] << 1 | arr[second]

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Посмотрите на http://graphics.stanford.edu/~seander/bithacks.html#InterleaveTableLookup На этой странице перечислены очевидные (для цикла) и 3 оптимизированных алгоритма. Ни один из них не является особенно простым, но без тестирования я бы предположил, что они значительно быстрее, чем цикл.

1 голос
/ 02 апреля 2010

в C #:

public Int32 Mix(Int16 b1, Int16 b2)
{
  Int32 res = 0;
  for (int i=0; i<16; i++)
  {
    res |= ((b2 >> i) & 1) << 2*i;
    res |= ((b1 >> i) & 1) << 2*i + 1;
  }
  return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...