Как я получаю поразрядные данные из целочисленного значения в C?

Я хочу извлечь биты десятичного числа.

Например, 7 двоичный 0111, и я хочу добраться 0 1 1 1 весь бит, сохраненный в bool. Как я могу сделать так?

Хорошо, цикл не является хорошим вариантом, я могу сделать что-то еще для этого?

95
задан Peter Mortensen 1 December 2015 в 18:57
поделиться

3 ответа

Если вам нужен 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");
}
144
ответ дан 24 November 2019 в 05:47
поделиться

Вот очень простой способ сделать это:

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;
}
3
ответ дан 24 November 2019 в 05:47
поделиться

Вот один способ сделать это - есть много других:

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);
4
ответ дан 24 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: