c - 将unsigned char字节打包成c中的unsigned int

标签 c bit-shift bit pack

我有一个任务,我必须将 4 个无符号字符的字节打包成一个无符号整数。

代码如下:

#include <stdio.h>

int main (){
    //Given this
    unsigned char a = 202; 
    unsigned char b = 254; 
    unsigned char c = 186; 
    unsigned char d = 190; 

    //Did this myself
    unsigned int u = a; 
    u <<=8; 
    u |= b; 
    u <<=8; 
    u |= c
    u <<=8; 
    U |= d; 
}

我知道:

u <<=8; 

将 u 中的位向左移动 8。但是我很困惑像 u |= b; 这样的行是做什么的?

简单地说,我试图更好地理解我编写的代码如何将字节从 4 个 unsigned char 打包到一个 unsigned int 中。我以一种粗暴的方式想出了这个解决方案。我只是试图以不同的方式打包字节,这种方式奏效了。但我不确定为什么。

提前致谢。

最佳答案

a 在二进制中是 202 将是 11001010

b 在二进制中是 254 将是 11111110

c 在二进制中是 186 将是 10111010

d 在二进制中是 190 将是 10111110

unsigned int u = a;
u <<= 8;    // now u would be 11001010 00000000
u |= b;     // now u would be 11001010 11111110
u <<= 8;    // now u would be 11001010 11111110 00000000
u |= c;     // now u would be 11001010 11111110 10111010
u <<= 8;    // now u would be 11001010 11111110 10111010 00000000
u |= d;     // now u would be 11001010 11111110 10111010 10111110
            // This is how        a        b        c        d    
            // are packed into one integer u.

关于c - 将unsigned char字节打包成c中的unsigned int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25881710/

相关文章:

c - 使用移位/屏蔽遇到奇怪的行为

带前导零的 C# BitArray

c - 读取 float

c - C 中的类型有任何保证的最小尺寸吗?

c - 为什么我的共享库在编译为位置无关代码时要大得多?

C:代码中没有 switch 的语句有 2 个以上的后继者

将 2 个 uint16_t 组合成 1 个 uint32_t

c - C 中无符号整型的右移位加 1

c# - 更改整数位

arrays - 按位移位以及此解决方案为何有效