我试图将以下位序列组合成一个变量,然后我将其转换为小数。
*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);
}
你的函数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
。
int
,您可能想要使用unsigned long long int
或uint64_t
Int的大小未在C标准中指定。所以当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