2017-09-07 15 views
0

次の多次元char配列があります。最初にXORのマスク配列を持つ配列の1つを取得し、次にANDの結果をもう1つの配列に格納する必要があります。それを実装する最も速い方法は何ですか?多次元char配列のビット操作をC言語で行う方法

注:char配列のサイズは、20 KBほどです。そのような

unsigned char test1[2][2] = { { 'a','b' },{ 0 } }; 
unsigned char test2[2][2] = { { 0 },{ 'O','S' } }; 
unsigned char mask[2][2] = { 0 }; 
+0

テスト配列の値が常にマスクと論理積されることを保証できますか?マスクは変わるのですか? – Gerhardh

+0

マスクは決して変わりません@ Gerhardh – George

答えて

0

何かが速いことがあります

int cnt = sizeof(mask)/sizeof(unsigned char) 

while(cnt>0) 
{ 
    *((unsigned char*)test1+cnt) ^= *((unsigned char*)mask+cnt); 
    *((unsigned char*)test1+cnt) &= *((unsigned char*)test2+cnt); 
    cnt--; 
} 

配列による方法のみ1時間あり、あなたはわずか3ポインタウィッヒがよく、コンパイラによって最適化することができる移動します。最も効率的であるためには、いくつかのテストを行い、アセンブリの出力を確認する必要があります。 (X86、ARM、AVR、PIC、...)

+2

@George:高速であるため、文字をロードするのではなくレジスタ保持(アーキテクチャ依存)できる最大の整数をロードする必要があります。ここでそれについて読む:https://stackoverflow.com/a/21336509/8051589。 –

+0

XORは実際には機能しません。 test1の値は操作後も変わりません。私もXOR結果を別の配列に代入しようとしましたが、同じ結果が得られました.XOR演算は機能しません。 @AndreKampling – George

+0

@Georgeマスクの価値は何ですか?この例のように0を指定すると、XORは何も行いません。 – Julien