Я хочу извлечь биты десятичного числа.
Например, 7 двоичный 0111, и я хочу добраться 0 1 1 1 весь бит, сохраненный в bool. Как я могу сделать так?
Хорошо, цикл не является хорошим вариантом, я могу сделать что-то еще для этого?
Если вам нужен k-й бит из n, то сделайте
(n & ( 1 << k )) >> k
Здесь мы создаем маску, применяем маску к n, а затем сдвигаем вправо замаскированное значение, чтобы получить только нужный нам бит. Мы можем записать это более полно так:
int mask = 1 << k;
int masked_n = n & mask;
int thebit = masked_n >> k;
Вы можете прочитать больше о битовой маске здесь.
Вот программа:
#include <stdio.h>
#include <stdlib.h>
int *get_bits(int n, int bitswanted){
int *bits = malloc(sizeof(int) * bitswanted);
int k;
for(k=0; k<bitswanted; k++){
int mask = 1 << k;
int masked_n = n & mask;
int thebit = masked_n >> k;
bits[k] = thebit;
}
return bits;
}
int main(){
int n=7;
int bitswanted = 5;
int *bits = get_bits(n, bitswanted);
printf("%d = ", n);
int i;
for(i=bitswanted-1; i>=0;i--){
printf("%d ", bits[i]);
}
printf("\n");
}
Вот очень простой способ сделать это:
int main()
{
int s=7,l=1;
vector <bool> v;
v.clear();
while (l <= 4)
{
v.push_back(s%2);
s /= 2;
l++;
}
for (l=(v.size()-1); l >= 0; l--)
{
cout<<v[l]<<" ";
}
return 0;
}
Вот один способ сделать это - есть много других:
bool b[4];
int v = 7; // number to dissect
for (int j = 0; j < 4; ++j)
b [j] = 0 != (v & (1 << j));
Трудно понять, почему использование цикла нежелательно, но его достаточно легко развернуть:
bool b[4];
int v = 7; // number to dissect
b [0] = 0 != (v & (1 << 0));
b [1] = 0 != (v & (1 << 1));
b [2] = 0 != (v & (1 << 2));
b [3] = 0 != (v & (1 << 3));
Или вычисление константных выражений в последних четырех операторах:
b [0] = 0 != (v & 1);
b [1] = 0 != (v & 2);
b [2] = 0 != (v & 4);
b [3] = 0 != (v & 8);