1

2 つの char 配列があります。

unsigned char a[8];

unsigned char b[8];

XOR 操作を行うにはどうすればよいですか。

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

答えてくれてありがとう。

4

5 に答える 5

8
std::transform(std::begin(a), std::end(a),
    std::begin(b),
    std::begin(p),
    std::bit_xor<unsigned char>());
于 2012-10-29T14:10:19.307 に答える
2
for(int i = 0; i < 8; ++i)
{
    p[i] = a[i] ^ b[i];
}

p もunsigned char十分なサイズ ( >=8)の配列である場合

ここに別の解決策がありますが、それは本当に悪いです。楽しみのために。長さが 8 バイトの型があるとします。型の名前を long long にします。あなたはこれを行うことができます(しかし、しないでください:))

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);
于 2012-10-29T13:55:58.740 に答える
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ループで行うことができますが、ここでは説明のために手動で行いました。

于 2012-10-29T13:56:20.267 に答える
0

そこで書いたコードは、ビット単位のXORをうまく実行します。中に入れるだけfor(int i(0); i < 8; ++i){ ... }

または、より複雑な比較が必要な場合は、次の方法があります。

この例では、char'y'は1で、それ以外は0です。したがって、XORはy#と#yに対してtrueを与える必要がありますが、yyまたは##に対してはtrueを与えません。

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;
     }
   }
}
于 2012-10-29T13:57:50.017 に答える
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)
                                     );
于 2015-07-09T14:31:47.763 に答える