gpt4 book ai didi

c - 在C中用位操作打包和解包数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:12 25 4
gpt4 key购买 nike

我尝试用 C 中的位操作对数据进行打包和解包。我的期望是,如果我输入 4 个输入 1、2、3、4,那么输出应该是 1234。但我没有得到预期的输出。请让我知道我的代码有什么问题,或者我预期的输出本身就是错误的。

#include <stdio.h>

void displabits(int input)
{
int mask=0x1, i;
for (i=31; i>=0; i--)
{
mask = 1 << i;
putchar((input & mask)? '1' : '0');
if(i%8 == 0)
putchar(' ');
}
printf("\n");
}

int main()
{
int a, b, c, d, packed_output=0, mask=0x1, p=0, q=0, r=0, s=0, temp;
printf("Enter first character\r\n");
scanf("%d",&a);
displabits(a);
printf("Enter second character\r\n");
scanf("%d",&b);
displabits(b);
printf("Enter third character\r\n");
scanf("%d",&c);
displabits(c);
printf("Enter fourth character\r\n");
scanf("%d",&d);
displabits(d);
a = a << 24;
displabits(a);
b = b << 16;
displabits(b);
c = c << 8;
displabits(c);
/* Packing data start */
packed_output = packed_output | a;
packed_output = packed_output | b;
packed_output = packed_output | c;
packed_output = packed_output | d;
printf("packed_output = %d\r\n", packed_output);
printf("packed_output in 32 bit format formar");
displabits(packed_output);
/* Packing data end */

/* Unpacking data start */
mask = ~(~0<<8)<<(31-8+1);
p = packed_output & mask;
p = p >> 24;
mask = ~(~0<<8)<<(23-8+1);
q = packed_output & mask;
q = q >> 16;
mask = ~(~0<<8)<<(15-8+1);
r = packed_output & mask;
r = r >> 8;
mask = ~(~0<<8)<<(7-8+1);
s = packed_output & mask;
printf("unpacked output's are as follows\r\n");
printf("first character = %d\r\n", p);
printf("first character in bit format\r\n");
displabits(p);
printf("second character = %d\r\n", q);
printf("second character in bit format\r\n");
displabits(q);
printf("third character = %d\r\n", r);
printf("third character in bit format\r\n");
displabits(r);
printf("fourth character = %d\r\n", s);
printf("fourth character in bit format\r\n");
displabits(s);
/* Unpacking data end */
return 0;
}

我已将打包和解包逻辑放在同一个代码库中。

最佳答案

主要问题是你在不同的基地进行操作。这就是为什么你会得到意想不到的答案。 n << p是二进制运算,实际上等于n * (2 ^ p) .然而,你想要的是 n * (10 ^ r) .所以,如果你想以人类可读的形式得到你的答案,你需要一个常规的十进制算法,比如:

a = a * 1000;
b = b * 100;
c = c * 10;
packed_output += a;
packed_output += b;
packed_output += c;
packed_output += d;

关于c - 在C中用位操作打包和解包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49498488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com