Самые быстрые способы установить и получить немного - PullRequest
3 голосов
/ 07 декабря 2010

Я просто пытаюсь разработать сверхбыстрые функции для установки и получения битов в массивах uint32. Например, вы можете сказать «установить бит 1035 в 1». Затем uint32, индексированный 1035/32, используется с битовой позицией 1035% 32. Мне особенно не нравится ветвление в функции setbit.

Вот мой подход:

void SetBit(uint32* data, const uint32 bitpos, const bool newval)
{
   if (newval)
   {
      //Set On
      data[bitpos >> 5u] |= (1u << (31u - (bitpos & 31u)));
      return;
   }
   else
   {
      //Set Off
      data[bitpos >> 5u] &= ~(1u << (31u - (bitpos & 31u)));
      return;
   }
}

и

bool GetBit(const uint32* data, const uint32 bitpos)
{
   return (data[bitpos >> 5u] >> (31u - (bitpos & 31u))) & 1u;
}

Спасибо!

1 Ответ

0 голосов
/ 08 февраля 2012

Во-первых, я бы отбросил 31u - ... из всех выражений: все, что он делает, это переупорядочивает биты в вашем частном представлении набора битов, так что вы можете перевернуть этот порядок, чтобы никто не заметил.

Во-вторых, вы можете избавиться от ветви, используя умный бит взломать :

void SetBit(uint32* data, const uint32 bitpos, const bool f)
{
    uint32 &w = data[bitpos >> 5u];
    uint32 m = 1u << (bitpos & 31u);
    w = (w & ~m) | (-f & m);
}

В-третьих, вы можете упростить ваш метод получения, разрешив компилятору выполнить преобразование:

bool GetBit(const uint32* data, const uint32 bitpos)
{
    return data[bitpos >> 5u] & (1u << (bitpos & 31u));
}
...