целое число в логический массив из битов, наиболее эффективный способ в C ++? - PullRequest
3 голосов
/ 10 декабря 2011

У меня есть небольшая интересная проблема, и я знаю, что есть несколько способов снять кожу с кошки, но мне было интересно, каким будет лучший / самый эффективный способ.

Скажем, например, у меня есть целое число со значением 534 и массив, который может хранить 16 логических значений

сейчас, 534 в двоичном виде - 10000010110

как лучше всего добраться от 534 до

array[0] = 0
array[1] = 1
array[2] = 1
array[3] = 0
array[4] = 1
....
array[15] = 0

Заранее спасибо!

Ответы [ 2 ]

13 голосов
/ 10 декабря 2011

Используйте std::bitset<16> и вызовите operator[] для доступа к отдельным битам:

#include <iostream>
#include <bitset>

int main()
{
     std::bitset<16> bits(534);
     std::cout << bits << std::endl;

     //use operator[] to access individual bits
     std::cout << bits[2] << std::endl; 
}

Вывод ( демо ):

0000001000010110
1

Это может быть не наиболее эффективным, но если учесть безопасность , то это лучшая альтернатива необработанным типам массивов. Разница в эффективности будет почти незначительной.

Если число битов неизвестно во время компиляции и может быть известно во время выполнения, тогда boost::dynamic_bitset поможет вам. Посмотрите на это:

Из его Документ ,

Класс dynamic_bitset представляет набор битов. Он обеспечивает доступ к значению отдельных битов с помощью оператора [] и предоставляет все побитовые операторы, которые можно применять к встроенным целым числам, такие как оператор & и оператор <<. Количество битов в наборе указывается во время выполнения через параметр для конструктора dynamic_bitset. </p>

Класс dynamic_bitset практически идентичен классу std :: bitset. Разница в том, что размер dynamic_bitset (количество битов) указывается во время выполнения во время создания объекта dynamic_bitset, тогда как размер std :: bitset указывается во время компиляции через целочисленный параметр шаблона.

2 голосов
/ 10 декабря 2011

Как это:

for (unsigned int i = 0; i != 16; ++i)
{
  array[i] = n & 1;
  n /= 2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...