我有兩個字符數組:異或兩個char數組在C++
unsigned char a[8];
和
unsigned char b[8];
我該怎麼辦的XOR操作:
p[i]=a[i]^b[i]
感謝您的答案。
我有兩個字符數組:異或兩個char數組在C++
unsigned char a[8];
和
unsigned char b[8];
我該怎麼辦的XOR操作:
p[i]=a[i]^b[i]
感謝您的答案。
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);
或者你可以使用uint64_t中,這是保證爲8個字節長。 – orlp
@nightcracker:其實我的答案是關於C++ 03的。 C++ 11支持還沒有那麼普及。 –
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循環,但我做到了手動這裏用於說明目的這樣做。
您在那裏編寫的代碼執行按位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;
}
}
}
我不明白... –
@阿門好了,他已經有了^運營商,所以我一直在努力去理解他不知道的東西。這是我承認的一點點延伸,但是如果他想根據指定的值而不是逐位對字符進行異或運算,那麼這就是它的邏輯。即我想把所有那些指定值的字符視爲真,並且所有那些不是假的,然後XOR它...... *聳聳肩*它可能會有所幫助。 – Ian
std::transform(std::begin(a), std::end(a),
std::begin(b),
std::begin(p),
std::bit_xor<unsigned char>());
+1,我會做的解決方案,但我會寫一個lambda,因爲我不知道std :: bit_xor – CashCow
順便說一句,你確定存在std :: bit_xor?它似乎不在C++ 03中。它在C++ 11中嗎? –
@CashCow - 我是一個圖書館的傢伙。我不做lambdas。
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)
);
使用'爲()'循環和一些做逐個元素 – Rost