Учитывая целое число, я хочу получить его двоичное выражение и сохранить его в булевом массиве.
Например,
bool b[32];
int a=98; // a=0b1100010
Надеюсь, есть способ сделать b, 010001100000000000000000 или что-то подобное.
Я немного разбираюсь в битах, но не знаю, как преобразовать биты в логический массив (кроме использования для цикла).
Я думал, что 98 хранится на компьютере в виде последовательности 1 или 0, должен быть какой-то способ, чтобы мы могли получить эту последовательность, но я не знаю, как это сделать.
Спасибо.
Я думаю, вы на правильном пути с bitset
.
Чтобы построить bitset
размером 32, содержащий 98, вы можете просто сделать:
bitset<32> foo(98);
Вы также можете построить такую вставку, что в наиболее значимых битах:
bitset<32> foo(98 << 24);
cout << foo.to_string() << endl; // Prints: 01100010000000000000000000000000
Что касается преобразования bitset
в массив, нет необходимости использовать operator[]
для bitset
. Плюс вы получаете:
all
any
count
flip
none
reset
set
to_string
to_ulong
to_ullong
Плюс все логические операторы, которые поддерживаются целыми числами.
Редактировать:
ОК, скажем, у вас есть 100 int
которые вы хотите поместить в bitset<sizeof(int)>
в: vector<int> bar;
Давайте также скажем, например, что вы хотите отменить только нечетные int
s. Вот что я буду делать:
vector<bitset<sizeof(int) * 8>> foo(bar.size()); // Creating as many empty bitsets as there are ints in bar
for (int i = 0; i < bar.size(); ++i){
foo[i] = bar[i]; // Initializing each element of foo
if (foo[i][0].test()){ // Is this number odd
for (int j = 0; j < foo[i].size() / 2; ++j){ // This loop reverses the elements in a bitset
const bool swap = foo[i][j];
foo[i][j] = foo[i][foo[i].size() - j - 1];
foo[i][foo[i].size() - j - 1] = swap;
}
}
cout << i << ". " << foo[i] << endl; // This is for testing purposes it'll print the contents of the indexed bitset in foo
}