如何在C中组合3个二进制数据?

问题描述 投票:0回答:3

我试图将以下位序列组合成一个变量,然后我将其转换为小数。

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

位顺序应该如下;

newBin = 0001101010001011(newBin = b3b2b1)

我试过跟随代码片段,但无法得到正确的十进制等效值。

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

当我打印联合收割机它给4097但它应该给6795。

我将不胜感激任何帮助/建议。

重要说明:我已经尝试过combine =(* b1 << 12)|(* b2 << 6)| * b3;并结合=(* b3 << 16)|(* b2 << 10)| * b1;结果都一样; 4097。

在完整的程序中,我正在解析32位值。我使用了下面链接中“forefinger”给出的代码。

How do I get bit-by-bit data from an integer value in 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);
}
c bitwise-operators
3个回答
0
投票

你的函数get_bits不返回int或类似的,你可以通过位移和按位OR组合。它返回一个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
投票
  1. 你移动太多了,你最终会在你的数字之间留下零
  2. 不要使用int,您可能想要使用unsigned long long intuint64_t Int的大小未在C标准中指定。
  3. 我尝试在python中运行你的代码,结果763905给我,所以你可能还有其他一些未在这里显示的错误。
  4. 你为什么用它们作为指针?这似乎与你在这里提出的问题无关。

0
投票

所以当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
© www.soinside.com 2019 - 2024. All rights reserved.