Битовая операция вместо if для копирования битовых карт - PullRequest
0 голосов
/ 22 марта 2012

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

#define BYTE_POS(pos) (pos / CHAR_BIT)
#define BIT_POS(pos) (1 << (CHAR_BIT - 1 - (pos % CHAR_BIT)))

if ((old_array[BYTE_POS(old_pos)] & BIT_POS(old_pos)) != 0) {
    new_array[BYTE_POS(new_pos)] |= BIT_POS(new_pos);
}

1 Ответ

1 голос
/ 23 марта 2012

Измените BIT_POS на это:

#define BIT_POS(pos, state) (state << (CHAR_BIT - 1 - (pos % CHAR_BIT)))

затем измените код на:

bool state = (old_array[BYTE_POS(old_pos)] & BIT_POS(old_pos, 1)) != 0);

new_array[BYTE_POS(new_pos)] |= BIT_POS(new_pos, state);
...