2013-08-22 51 views
0

我有像字節的無符號字符數組:C:計算一系列位跨越在幾個字節

unsigned char[20] = {0xff, 0x1a, 0x70, 0xa9, ...} 

我現在要執行移到該陣列的X個連續位的計算(具有x > 8;例如x = 15)。特別是,我想對每15位進行一次主投票,返回一位。隨後,返回的單個位將再次轉換爲無符號的字節。

我已經實現了majorityVoting算法。我還實施了整個問題天真的算法,它的工作原理是這樣的:

  1. 字節數組轉換爲位陣列(也無符號的char []持零和一),位排列
  2. 遍歷和將每個x位系列傳遞給多數投票函數
  3. 收集大多數投票結果也是位數組(unsigned char [])
  4. 循環遍歷此位數組,並使用按位操作構造來自每個8位系列的字節位。

對我來說,這看起來很直觀但同時又很麻煩。

您是否看到任何優化的可能性,或者您甚至可以給出一個更清晰的算法?

最好的問候, P.

+1

你能解釋一下你爲什麼不只使用16位塊有1個未使用的填充位?事實上,我希望這是最初的目的,其結果存儲在第16位。 –

回答

0

你可以得到數組的下位與這樣的

int nextBit(unsigned char [] arr, int *pByte, size_t nBytes, int *pBit) 
{ 
     int result; 

     if(*pByte >= nBytes) { 
      // Padding, neccessary if nBytes % 15 != 0 
      return 0; 
     } else { 
      result = (arr[*pByte] >> (*pBit)) & 0x1; 
      if(*pBit == 7) { 
       (*pByte)++; 
       *pBit = 0; 
      } else { 
       (*pBit)++; 
      } 
      return result; 
     } 
} 

和循環功能:

int byte=0, bit=0; 
int result; 
int i; 

while(byte < sizeof(arr)) { 
    for(i=0; i<15; i++) { 
     result = nextBit(arr, &byte, sizeof(arr), &bit); 
     // do the majority voting 
    } 
} 

相當類似的功能被創建以直接創建大多數位的陣列

0

您可以將每個字節移位爲17位(並將它們存儲在17個字節中)。

uint8_t bits[17]; 
bits[0] = !!(bytes[0] & 128); 
bits[1] = !!(bytes[0] & 64); 
bits[2] = !!(bytes[0] & 32); 
bits[3] = !!(bytes[0] & 16); 
bits[4] = !!(bytes[0] & 8); 
bits[5] = !!(bytes[0] & 4); 
bits[6] = !!(bytes[0] & 2); 
bits[7] = !!(bytes[0] & 1); 
bits[8] = !!(bytes[1] & 128); 
bits[9] = !!(bytes[1] & 64); 
bits[10] = !!(bytes[1] & 32); 
bits[11] = !!(bytes[1] & 16); 
bits[12] = !!(bytes[1] & 8); 
bits[13] = !!(bytes[1] & 4); 
bits[14] = !!(bytes[1] & 2); 
bits[15] = !!(bytes[1] & 1); 
bits[16] = !!(bytes[2] & 128); 

我不知道你要對這些位做什麼,但你也可以考慮存儲在32位整數位:

uint32_t chunk = (bytes[0] << 9) | (bytes[1] << 1) | (bytes[2] & 1);