2012-04-27 58 views
0

我正在開發一個應該使用非常少的資源並且速度非常快的應用程序。在我的應用程序中,我使用包含從圖像中獲取的字節的unsigned char* rawData。所以在這個rawData數組中,我必須保留一些字節和其他設置爲零。但我不允許使用任何循環(否則我可以遍歷每個字節並將它們設置爲零)。使用unsigned char。如何替換元素而不使用循環?

所以這裏有問題。

Q1)是否有在用C

Q2)目標C等ZeroMemory任何方法是否有任何其他方式來設置nessecary字節爲零,而無需使用任何循環。

在此先感謝...

P.S.可以提供一些代碼,如果nessecary ...

+2

'memset'會做你想要的嗎? – 2012-04-27 13:11:41

+0

感謝奧利的迴應。但我無法弄清楚如何使用memset。我認爲它不會做我想要的。我需要這樣的東西:'setZero:rawData FromByte:0 ToByte:someByte' – Garnik 2012-04-27 14:34:35

+0

嗯,認爲'memset'將幫助...這是唯一的方法... – Garnik 2012-04-30 08:37:46

回答

2

如果你不知道緩衝區的大小,你不能沒有循環。即使你不自己編寫循環,調用像strlen一樣會導致循環。我也將遞歸計算爲一個循環。

您如何知道要保留哪些字節以及將哪些設置爲零?如果這些字節位於已知位置,則可以使用向量操作將某些字節清零,而不是其他字節。下面的示例零出只有偶數字節在第一個64個字節的rawData

__m128i zeros = _mm_setzero_si128(); 
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; 
__m128i sse_mask = _mm_load_si128(mask); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]); 
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]); 

如果每個字節在mask高位爲1,在zeros對應的值將被複制到rawData。您可以使用這些掩碼副本的序列快速替換某些字節而不是其他字節。生成的機器代碼使用SSE操作,所以這實際上相當快。這不是必需的,但如果rawData是16字節對齊的,則SSE操作將運行得更快。

對不起,如果你的目標是ARM。我相信NEON內部函數是相似的,但不完全相同。

+0

嗯...首先我不知道爲什麼,也許它應該是這樣的,但我的'rawData'的大小(我初始化它像這樣'unsigned char * rawData =(unsigned char *)calloc(gridSize * gridSize,sizeof(unsigned char));')總是4,I認爲它返回4字節。第二件事我可以有我的緩衝區(rawData)沒有任何strlen的大小。第三個問題,對不起,但我不明白你的代碼。 :( – Garnik 2012-04-27 14:30:47

相關問題