我目前有一個從輸入文件中以十六進制讀取的整數值。我需要將32位比特流分成三個獨立的部分來操作它。所期望的輸出是下面:將位串分成三部分C
期望的輸出:
在此,V是我的輸入值,剩下的是第一X1數字,下一個是X1和X2之間的數字,和最後是從X2到最後的數字。有一個限制,每個子部分的長度必須大於0。
是什麼讓這個困難的是,我在哪裏分裂X的位置變化(X1和X2可以改變)
是否有分割這些起來的好辦法?
我目前有一個從輸入文件中以十六進制讀取的整數值。我需要將32位比特流分成三個獨立的部分來操作它。所期望的輸出是下面:將位串分成三部分C
期望的輸出:
在此,V是我的輸入值,剩下的是第一X1數字,下一個是X1和X2之間的數字,和最後是從X2到最後的數字。有一個限制,每個子部分的長度必須大於0。
是什麼讓這個困難的是,我在哪裏分裂X的位置變化(X1和X2可以改變)
是否有分割這些起來的好辦法?
這裏的splitter()
函數執行你要求的工作。不幸的是,這需要很多爭論。有值要拆分(value
),該值的最低有效結束處的塊的大小(p1
),中間塊的大小(p2
),然後指向高,中和低值(hi_val
,md_val
,lo_val
)。
#include <assert.h>
#include <inttypes.h>
#include <stdio.h>
static void splitter(uint32_t value, unsigned p1, unsigned p2, uint32_t *hi_val, uint32_t *md_val, uint32_t *lo_val)
{
assert(p1 + p2 < 32);
*lo_val = value & ((1U << p1) - 1);
value >>= p1;
*md_val = value & ((1U << p2) - 1);
value >>= p2;
*hi_val = value;
}
static void test_splitter(uint32_t value, int p1, int p2)
{
uint32_t hi_val;
uint32_t md_val;
uint32_t lo_val;
splitter(value, p1, p2, &hi_val, &md_val, &lo_val);
printf("0x%.8" PRIX32 " (%2u,%2u,%2u) = 0x%.4" PRIX32 " : 0x%.4" PRIX32 " : 0x%.4" PRIX32 "\n",
value, (32 - p1 - p2), p2, p1, hi_val, md_val, lo_val);
}
int main(void)
{
uint32_t value;
value = 0xFFFFFFFF;
test_splitter(value, 9, 11);
value = 0xFFF001FF;
test_splitter(value, 9, 11);
value = 0x000FFE00;
test_splitter(value, 9, 11);
value = 0xABCDEF01;
test_splitter(value, 10, 6);
test_splitter(value, 8, 8);
test_splitter(value, 13, 9);
test_splitter(value, 10, 8);
return 0;
}
的test_splitter()
功能允許單個值再加上它是被分割的部分的簡單的測試,並main()
調用測試功能的次數。
輸出是:
0xFFFFFFFF (12,11, 9) = 0x0FFF : 0x07FF : 0x01FF
0xFFF001FF (12,11, 9) = 0x0FFF : 0x0000 : 0x01FF
0x000FFE00 (12,11, 9) = 0x0000 : 0x07FF : 0x0000
0xABCDEF01 (16, 6,10) = 0xABCD : 0x003B : 0x0301
0xABCDEF01 (16, 8, 8) = 0xABCD : 0x00EF : 0x0001
0xABCDEF01 (10, 9,13) = 0x02AF : 0x006F : 0x0F01
0xABCDEF01 (14, 8,10) = 0x2AF3 : 0x007B : 0x0301
如果任何部分大於16,顯示被寵壞了 - 但代碼仍然有效。
從理論上講,1U
值可能是一個16位的數量,但我假設CPU正在與32位int
。有幾種方法(UINT32_C(1)
)確保它是32位值,但這可能是OTT。該代碼顯式強制32位無符號整數值,並打印它們。
如果我理解你的問題,你想分配數據。查看alloca
malloc
fucntions。
我不相信這就是所需要的。 –
移動適當數量的位置並用一個數字來掩蓋結果,並且只要你想要的位數就可以。例如'x&7'獲得低位0-2,'x >> 4&15'以獲得4-7位...... – Ryan
我對你得到7的位置感到困惑,這導致了位0-2和位4-15,導致位4-7? –
7是二進制111。 15是1111. 0-2是3比特,4-7是4比特。 – Ryan