gpt4 book ai didi

c++ - 如何将 4 个 UINT8 变量连接成一个 UINT32 变量?

转载 作者:太空狗 更新时间:2023-10-29 20:10:26 24 4
gpt4 key购买 nike

我有以下 UINT8 变量:

UINT8 var1 = 0b00000001; //0000 0001
UINT8 var2 = 0b00000011; //0000 0011
UINT8 var3 = 0b00000111; //0000 0111
UINT8 var4 = 0b00001111; //0000 1111

我想将这四个 UINT8 变量打包成一个 UINT32 变量,其值如下:

UINT32 var1 = 0b00000001000000110000011100001111; //00000001 00000011 00000111 00001111

下面的代码能正确安全地完成吗?

UINT32 var1 = (var1<<24) + (var2<<16) + (var3<<8) + var4;

最佳答案

简短回答,

我不会担心你是如何写二进制数的。我将以十六进制输入它们,并让您通过这个相关的 SO 问题查找二进制表示形式:Can I use a binary literal in C or C++?

#include "stdafx.h"   // you are using devstudio
#include <Windows.h> // you are using windows types
#include <iostream> // I print out the result
#include <bitset> // I use bitset to print the binary string

int main()
{
UINT8 var1 = 0x01; //0000 0001
UINT8 var2 = 0x03; //0000 0011
UINT8 var3 = 0x07; //0000 0111
UINT8 var4 = 0x0F; //0000 1111

UINT32 bigvar = (var1 << 24) + (var2 << 16) + (var3 << 8) + var4;
std::cout << std::bitset<32>(bigvar) << std::endl;
}

您的数学是正确且安全的。字节是独立声明的,因此您不必担心字节顺序。这些类型都是无符号的,因此符号位没有 UB 问题。移位都符合正确的位数,因此没有溢出。我生成了:

00000001000000110000011100001111

或者,您可以读入一个 4 字节的 32 位整数,并重构 32 位数字,但那样是不可移植的,因为有时数字以相反的顺序存储。例如,在 TIFF 中,您读入一个 header 值,该值告诉您是将 var1 放在第一位并向上计数,还是将 var4 放在第一位并向下计数。在几乎所有将一堆字节组合成一个更大的整数类型的实际应用中,字节顺序都是您必须注意的事情。查看大端和小端以获取更多信息。

关于c++ - 如何将 4 个 UINT8 变量连接成一个 UINT32 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978751/

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