учитывая два бита в наборе из четырех, найдите положение двух других битов - PullRequest
0 голосов
/ 24 марта 2010

Я работаю над простой частью комбинаторики и обнаружил, что мне нужно восстановить позицию двух битов, учитывая позицию других двух битов в 4-битной последовательности.

например, (0,1) соответствует (2,3), (0,2) - (1,3) и т. Д., В общей сложности шесть комбинаций.

Мое решение состоит в тестировании битов с использованием четырех вложенных троичных операторов:

ab is a four bit string, with two bits set.
c = ((((ab & 1) ? (((ab & 2) ? ... ))) : 0)
abc = ab | c
recover the last bit in the same fashion from abc.

Я должен уточнить, без использования циклов, мой целевой язык - шаблоны метапрограммирования C ++. Я знаю, что указывал язык явно, но, по-моему, он все еще агностичен

можете ли вы придумать лучший или более умный путь? спасибо

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

Просто введите значение x в двоичном виде 1111 - четыре бита перевернутся, и вы получите два других.

cd = ab ^ 0xF;
2 голосов
/ 24 марта 2010

Пространство проблемы довольно мало, поэтому решение на основе LUT быстро и просто.

Python:

fourbitmap = {
  3: (2, 3),
  5: (1, 3),
  6: (0, 3),
  9: (1, 2),
  10: (0, 2),
  12: (0, 1),
}

def getother2(n):
  return fourbitmap.get(n, None)
0 голосов
/ 24 марта 2010

Python:

def unset_bits(input=0x5):
    for position in range(4):
        if not (2**position) & input:
            yield position

Урожайность:

>>> list( unset_bits(0x1) )
[1, 2, 3]

>>> list( unset_bits(0x2) )
[0, 2, 3]

>>> list( unset_bits(0x3) )
[2, 3]
...