簡體   English   中英

如何將4個UINT8變量連接成一個UINT32變量?

[英]How do you concatenate 4 UINT8 variables into one UINT32 variable?

我有以下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問題尋找二進制表示: 我可以在C或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

或者,您可以讀取32位整數作為4個字節,並重建32位數,但這不可移植,因為有時數字以相反的順序存儲。 例如,在TIFF中,您讀入一個標題值,該值告訴您是先將var1放在第一位還是向上計數,或先將var4放在第四位並倒計時。 在將一堆字節組合成更大的整數類型的幾乎所有實際應用中,字節順序是您必須注意的。 查看big-endian和little-endian以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM