Алгоритмическая эффективность при выборе по битам - PullRequest
1 голос
/ 16 мая 2011

Мне было интересно, каковы были ваши идеи по разработке эффективного алгоритма для переключения if / else / case на основе битов.У меня есть 8 битов для игры, и мне нужно разделить их на биты старшего и младшего разрядов, например:

0000 1111

Каждая половина содержит некоторую информационную базу, на которой обращаются битына.Например, если нижняя половина (1111 в этой машине с прямым порядком байтов) на самом деле 0010, что-то происходит.Кроме того, если верхний предел равен 1000, происходит что-то еще.

Полагаю, было бы целесообразно сместить права верхнюю половину и сделать AND сравнение (например, (x >> 4) & 8), но я не уверен, чтоумнее делать для нижней половины, так как кажется немного невежливым сдвиг влево и сравнение с каким-то странным числом.

Ваше понимание, опять же, высоко ценится.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Прежде всего, (x >> 4) & 8 в вашем примере не совсем верно. Чтобы сравнить старший полубайт (старшие четыре бита) с n, вам нужно ((x >> 4) & 15) == n.

Чтобы сравнить нижний клев с n, вы просто теряете правое смещение: (x & 15) == n.

1 голос
/ 16 мая 2011

Чтобы замаскировать младшие 4 бита, вы можете использовать bits & 0xf, и если вы хотите проверить, имеют ли 4 бита определенное значение (то есть 2, то есть 0010), вы можете использовать ( bits & 0xf ) == 2 для нижней половины и ( bits >> 4 ) == 2 для верхней половины.

Endianess не имеет значения, когда вы смотрите только на один байт.

0 голосов
/ 16 мая 2011

Я не могу сказать, хотите ли вы что-нибудь эффективное, как вы говорите, или что-то умное. Если вы действительно хотите быстрое выполнение, нет ничего быстрее, чем оператор switch с 256 случаями. Посмотрите на код, который компилятор создает для switch, и вы увидите, что он очень быстрый.

Если вы хотите что-то умное, это другое дело. Но, как бы он ни был умен, он никогда не будет быстрее переключателя.

...