簡體   English   中英

將兩個 8 位整數合並為一個 16 位的 integer

[英]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 類型,在這種情況下推薦使用,因為您不能依賴intunsigned int的大小來具有一定的寬度。

但是,如果您只是將一個值移動 4 位(如您在示例中所做的那樣),則結果無需為 16 位。 在那種情況下,寬度為 8 位的 integer 類型就足夠了。 我只對結果使用 16 位,因為你明確要求它。

在大多數平台上,宏PRIX16可能會擴展為"hX""X" 但仍然建議在使用固定寬度 integer 類型時使用此宏,因為您不能依賴%hX%X作為所有平台上uint16_t的正確格式說明符。

暫無
暫無

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

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