[英]Combining two 8-bit integers to a 16-bit integer
IN C 編程中,如何將兩個整數合並(注意:不是相加)為一個大的integer? 所以如果我有
整數 a = 8 整數 b = 6
在二進制中它將是 int a = 1000 int b = 0110
所以結合起來就是= 01101000
您將結合使用<<
移位運算符和按位|
操作員。 如果您嘗試從兩個 4 位輸入構建一個 8 位值,則:
int a = 8;
int b = 6;
int result = (b << 4) | a;
如果你試圖從兩個 16 位輸入構建一個 32 位值,那么你會寫
result = (b << 16) | a;
例子:
#include <stdio.h>
int main( void )
{
int a = 8;
int b = 6;
printf( "a = %08x, b = %08x\n", (unsigned int) a, (unsigned int) b );
int result = (b << 4) | a;
printf( "result = %08x\n", (unsigned int) result );
result = (b << 8) | a;
printf( "result = %08x\n", (unsigned int) result );
result = (b << 16) | a;
printf( "result = %08x\n", (unsigned int) result );
return 0;
}
$ ./bits
a = 00000008, b = 00000006
result = 00000068
result = 00000608
result = 00060008
您可以使用二進制掩碼& 0x0F
和位轉換<<
執行以下操作:
int a = 0x08
int b = 0x06
int c = (a & 0x0F) + ((b & 0x0F) << 4 )
我希望它有所幫助
更新 1:
正如評論中提到的,添加+
或二進制或|
都很好。
在這個答案中要強調的是 mask & 0x0F
,我強烈建議使用這種機制來避免任何溢出。
您可以使用或運算符。
int a = 8 ;
int b = 6 ;
int c = (a << 8) | b;
您可以使用位移運算符<<
將位移動到正確的 position:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main()
{
uint8_t a = 8;
uint8_t b = 6;
uint16_t c = (b << 4) | a;
printf( "The result is: 0x%" PRIX16 "\n", c );
}
該程序將打印以下內容:
The result is: 0x68
請注意,此程序使用固定寬度的 integer 類型,在這種情況下推薦使用,因為您不能依賴int
或unsigned int
的大小來具有一定的寬度。
但是,如果您只是將一個值移動 4 位(如您在示例中所做的那樣),則結果無需為 16 位。 在那種情況下,寬度為 8 位的 integer 類型就足夠了。 我只對結果使用 16 位,因為你明確要求它。
在大多數平台上,宏PRIX16
可能會擴展為"hX"
或"X"
。 但仍然建議在使用固定寬度 integer 類型時使用此宏,因為您不能依賴%hX
或%X
作為所有平台上uint16_t
的正確格式說明符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.