2012-10-29 86 views
1

我有兩個字符數組:異或兩個char數組在C++

unsigned char a[8]; 

unsigned char b[8]; 

我該怎麼辦的XOR操作:

p[i]=a[i]^b[i] 

感謝您的答案。

+1

使用'爲()'循環和一些做逐個元素 – Rost

回答

2
for(int i = 0; i < 8; ++i) 
{ 
    p[i] = a[i]^b[i]; 
} 

其中,p也是unsigned char有足夠大的尺寸(>=8

這裏的另一種解決方案的數組,但它是非常糟糕的。只是爲了樂趣。想象一下,有一種長度爲8個字節的類型。讓這個類型的名字很長。你可以這樣做(但不:))

unsigned long long aa; 
unsigned long long bb; 

memcpy(&aa, a, 8); 
memcpy(&bb, b, 8); 
unsigned long long pp = a^b; 
memcpy(p, &pp, 8); 
+0

或者你可以使用uint64_t中,這是保證爲8個字節長。 – orlp

+0

@nightcracker:其實我的答案是關於C++ 03的。 C++ 11支持還沒有那麼普及。 –

0

XOR每個元素獨立:

p[0] = a[0]^b[0]; 
p[1] = a[1]^b[1]; 
p[2] = a[2]^b[2]; 
p[3] = a[3]^b[3]; 
p[4] = a[4]^b[4]; 
p[5] = a[5]^b[5]; 
p[6] = a[6]^b[6]; 
p[7] = a[7]^b[7]; 

你可以用一個for循環,但我做到了手動這裏用於說明目的這樣做。

0

您在那裏編寫的代碼執行按位XOR就好了。只要把它裏面for(int i(0); i < 8; ++i){ ... }

另外,如果你想那麼一個更復雜的比較孤單此方法:

在這個例子中,字符「Y」是1和其他任何爲0,所以XOR應該給我們真正的爲y#和#y,但不是yy或##。

bool p[8]; 
for (int i(0); i<8; ++i) 
{ 
    if (a[i] == 'y') 
    { 
    if (b[i] == 'y') 
    { 
     p[i] = false; 
    } 
    else 
    { 
     p[i] = true; 
    } 
    } 
    else 
    { 
    if (b[i] == 'y') 
    { 
     p[i] = true; 
    } 
    else 
    { 
     p[i] = false; 
    } 
    } 
} 
+0

我不明白... –

+0

@阿門好了,他已經有了^運營商,所以我一直在努力去理解他不知道的東西。這是我承認的一點點延伸,但是如果他想根據指定的值而不是逐位對字符進行異或運算,那麼這就是它的邏輯。即我想把所有那些指定值的字符視爲真,並且所有那些不是假的,然後XOR它...... *聳聳肩*它可能會有所幫助。 – Ian

8
std::transform(std::begin(a), std::end(a), 
    std::begin(b), 
    std::begin(p), 
    std::bit_xor<unsigned char>()); 
+1

+1,我會做的解決方案,但我會寫一個lambda,因爲我不知道std :: bit_xor – CashCow

+0

順便說一句,你確定存在std :: bit_xor?它似乎不在C++ 03中。它在C++ 11中嗎? –

+3

@CashCow - 我是一個圖書館的傢伙。我不做lambdas。

0
template <size_t SIZE> 
    struct xor_word 
    { 
    template <typename T> 
    static inline void crypt(T* pData, const T *key) 
    { 
     *pData ^= *key; 

     xor_word<SIZE - 1>::crypt<T>(pData + 1, key + 1); 
    } 
    }; 

    template <> 
    struct xor_word<0> 
    { 
    template <typename T> 
    static inline void crypt(T *pData, const T *key) 
    { /* nothing */ } 
    }; 

,並使用

unsigned char a[8] = ...; 
unsigned char b[8] = ...; 

static_assert((sizeof(a) % sizeof(size_t)) == 0); 
static_assert(sizeof(a) == sizeof(b)); 

xor_word< sizeof(a)/sizeof(size_t) >::crypt<size_t>(
             reinterpret_cast<size_t*>(a), 
             reinterpret_cast<size_t*>(b) 
            );