Как объединить 3 двоичных данных в C? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь объединить следующие битовые последовательности в одну переменную, тогда я буду преобразовывать ее в десятичную.

*b1=0b001011;
*b2=0b101010;
*b3=0b0001;

Порядок следования битов должен быть следующим:

newBin = 0001101010001011 (newBin = b3b2b1)

Я попробовал следующий фрагмент кода, но не смог получить правильный десятичный эквивалент.

int combine=(*b1<<16)|(*b2<<10)|*b3;

когда я печатаю комбайн, он дает 4097, но он должен дать 6795.

Буду признателен за любую помощь / предложение.

Важные примечания: я уже пробовал объединить = (* b1 << 12) | (* b2 << 6) | * b3; и объединить = (* b3 << 16) | (* b2 << 10) | * b1; результаты все одинаковы; 4097. </p>

в полной программе я анализирую 32-битное значение. Я использовал код, указанный "указательным пальцем" снизу ссылки.

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

Ниже приведен полный код моей версии;

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()
{
    long r=0b0010110100111110000010110110101010000001;
    int i;
    int byte1,byte2,byte3,byte4,byte5;
    //int *Lbits,*Mbits,*Hbits;
    int bw6=6,bw4=4;

    byte1 = (r>>32) & 0xFF;
    byte2 = (r>>24) & 0xFF;
    byte3 = (r>>16) & 0xFF;
    byte4 = (r>>8) & 0xFF;
    byte5 = (r>>0) & 0xFF;

   int *Lbits=get_bits(byte3,bw6);
   int *Mbits=get_bits(byte4,bw6);
   int *Hbits=get_bits(byte5,bw4);

   int combine=(Hbits<<12)|(&Mbits<<6)|Lbits;



  for(i=bw6-1; i>=0;i--)
  {
    printf("%d", Lbits[i]);
  }
  printf("\n");

  for(i=bw6-1; i>=0;i--)
  {
    printf("%d", Mbits[i]);
  }
  printf("\n");

  for(i=bw4-1; i>=0;i--)
  {
    printf("%d", Hbits[i]);
  }
  printf("\n");

  printf("%d",combine);
}

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Таким образом, когда br3 является MSB, оно должно быть:

int combine=(*b3<<12)|(*b2<<6)|*b1;


  0b0001     (1d)  * 4096  (12 left shift)  = 4096
 +0b101010   (42d) *   64  (6 left shift)   = 2688
 +0b001011   (11d) *    1                   =   11
  _________________________________________________
                                               6795
0 голосов
/ 17 апреля 2019

Ваша функция get_bits не возвращает int или что-либо подобное, что вы могли бы комбинировать путем сдвига битов и побитового ИЛИ. Он возвращает массив int, где каждый элемент содержит значение одного бита.

(Было бы возможно объединить данные из этих массивов по мере необходимости, обрабатывая биты один за другим, но у этой концепции есть другие ловушки, потому что вам нужно было бы убедиться, что вы не обращаетесь к динамически выделяемой памяти за пределами границ .)

Вот модифицированная версия вашей программы, которая работает с unsigned int вместо int массивов.

#include <stdio.h>

unsigned int get_bits(unsigned int n, int bitswanted){
    return n & ((1<<bitswanted)-1);
}

int main()
{
    unsigned long r=0b0010110100111110000010110110101010000001;
    int i;
    int byte1,byte2,byte3,byte4,byte5;

    int bw6=6,bw4=4;

    byte1 = (r>>32) & 0xFF;
    byte2 = (r>>24) & 0xFF;
    byte3 = (r>>16) & 0xFF;
    byte4 = (r>>8) & 0xFF;
    byte5 = (r>>0) & 0xFF;

   int Lbits=get_bits(byte3,bw6);
   int Mbits=get_bits(byte4,bw6);
   int Hbits=get_bits(byte5,bw4);

   int combine=(Hbits<<12)|(Mbits<<6)|Lbits;

   printf("%d\n",combine);
}

Программа выводит результат 6795.

см. https://ideone.com/44pjjF

0 голосов
/ 17 апреля 2019
  1. Вы слишком сильно сдвигаетесь, в итоге вы оставляете нули между вашими числами
  2. Не используйте int, вы, вероятно, хотите использовать unsigned long long int для этого или uint64_t Размер Intне указано в стандарте C.
  3. Я попытался запустить ваш код на python, и он показал мне 763905, поэтому у вас могут быть другие ошибки, которые здесь не показаны.
  4. Почему выиспользуя их в качестве указателей?Это не имеет отношения к вопросу, который вы здесь задаете.
...