2011-09-30 24 views
3

首先,我們假設我有endian整理出來,並且知道先驗類型的大小。什麼是確定作爲二進制字符串給定類型的大小的有效方法?

我在做什麼:我有一個函數bs2i(char *bitStr),它接受一個表示signed char/short/int/long二進制數的字符數組。陣列可以有任何長度< = sizeof(long long)

我想要做的是採取bitStr [0]並將其設置爲符號位,以便它不會被截斷,如果我執行類似char val = bs2i("111")。在這種情況下,函數應該返回-125,因爲這些位將被設置爲「000 ... 00010000011」。爲此,我需要知道最終類型需要多長時間,以便我可以將msb轉移到適當的位置。

這是我迄今:

size_t size = (((strlen(bitStr)-1)>>3)+1)<<3; 

但我只是意識到,僅適用於字符和短褲。例如,一串長度爲的應該返回大小爲32,但只能用此方法返回24。有沒有一種有效的方法來確定合適的長度應該是什麼?

僅供參考,這裏是全功能:

long long bs2i(char *bitStr) { 
    long long val = 0l; 
    size_t len = (((strlen(bitStr) - 1) >> 3) + 1) << 3; 
    char msb = *bitStr & 1; 
    bitStr++; 
    while (*bitStr) { 
     val = (val << 1l) | (*bitStr & 1); 
     bitStr++; 
    } 
    val = (msb << len-1l) | val; /* Use MSB as sign bit */ 

    return val; 
} 

加分,我想,如果有可以做到這一點並不需要類型大小的先驗知識的好方法。

+0

**該數組的長度可以是任何長度<= sizeof(long long)。**這是錯誤的......限制是64個字節,如果我沒有弄錯的話,是LongLong的大小。我想重點是有一個限制。 –

+0

@Ramhound是不是這意味着什麼?我所說的是,只要長度<=,字符串可以是任意大小。 –

回答

4

這聽起來像是你想找到最少的8位數的倍數,它可以適合字符串中有字符的位數。如果您最多有64位,爲什麼不在字符串長度上使用switch

switch((strlen(bitStr) - 1) >> 3) { 
    case 0: return 8; /* strlen <= 8 */ 
    case 1: return 16; /* strlen <= 16 */ 
    case 2: 
    case 3: return 32; /* strlen <= 32 */ 
    case 4: 
    case 5: 
    case 6: 
    case 7: return 64; /* strlen <= 64 */ 
    default: return 0; 
} 

或者,你可以試試這個:

int reqIntSz(char *bitStr) 
{ 
    int len = strlen(bitStr); 
    int res = 8; 
    while (len > res) res <<= 1; 
    return res; 
} 
+0

一個很好的解決方案!我只是想知道是否有更簡化的C風格解決方案。 –

+1

編輯添加備用方法。 – Dmitri

+0

謝謝!我最終使用了reqIntSz函數的變體。 –

0

你要位長度舍入爲二的冪以最小的8 Wikipedia has a decent algorithm for doing this.算法的實質是設置每位高於最高位,然後添加一個。

由於您不想輪到8到16輪,所以您必須稍微調整一下,但這很簡單,可以自行計算出來。

相關問題