我有两个char数组:
unsigned char a[8];
和
unsigned char b[8];
如何进行XOR操作:
p[i]=a[i]^b[i]
感谢您的回答。
答案 0 :(得分:8)
std::transform(std::begin(a), std::end(a),
std::begin(b),
std::begin(p),
std::bit_xor<unsigned char>());
答案 1 :(得分: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);
答案 2 :(得分: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循环执行此操作,但我在此处手动执行此操作以用于说明目的。
答案 3 :(得分:0)
你在那里写的代码按位XOR就好了。只需将其放在for(int i(0); i < 8; ++i){ ... }
或者,如果你想要一个更复杂的比较,那么这个方法就是:
在这个例子中,char'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;
}
}
}
答案 4 :(得分: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)
);