0

我想要做的是在 C++ 中对同一结构的两个变量进行按位异或,即

    D[i] ^= D[j];

其中 D 是一个包含字符串、int、...的数组。

但是,编译器抱怨(这里使用整数数组作为索引,意思是 D[dInd[u]]^=...):

Description Resource    Path    Location    Type
no match for ‘operator^=’ in ‘*(D + ((long unsigned int)(((long unsigned int)
(*(dInd + ((long unsigned int)(((long unsigned int)u) * 4ul))))) * 2808ul))) 
^= *(D + ((long unsigned int)(((long unsigned int)(*(dInd + ((long unsigned 
int)(((long unsigned int)i) * 4ul))))) * 2808ul)))’

有谁知道我如何纠正这条线以实现按位异或?

任何提示都非常感谢。在此先感谢,干杯 - 亚历克斯

4

2 回答 2

3

重载结构中的成员:

struct X
{
   X& operator ^= (const X& other)
   {
       //...
       return *this;
   }
};
于 2012-07-17T09:42:08.907 回答
1

这有点棘手......您可以通过将结构重新解释为可异或类型的数据的连续区域进行异或,或者考虑如何依次对每个数据成员进行异或。这两种方法都有您需要考虑的问题,哪种方法最好取决于您这样做的原因。

例如:

struct X
{
    X& operator^=(const X& rhs)
    {
        // WARNING: this won't follow pointers to "owned" data
        unsigned char* p = (unsigned char*)this;
        unsigned char* q = (unsigned char*)&rhs;
        size_t size = sizeof *this;
        while (size--)
            *p++ ^= *q++;
    }
};

对比

    X& operator^=(const X& rhs)
    {
        my_int ^= rhs.my_int;

        for (size_t i = 0; i < sizeof my_int_array / sizeof my_int_array[0]; ++i)
             my_int_array[i] ^= rhs.my_int_array[i];

        // WARNING: this won't XOR the string object's embedded data members -
        //          typically a pointer to the text, a size & capacity etc..
        std::string::const_iterator j = rhs.my_string.begin();
        for (std::string::iterator i = my_string.begin(); i != my_string.end() && j != rhs.my_string.end(); ++i, ++j)
            *i ^= *j;

        // note: you'll have to decide what to do for different-length string data, doubles etc.
    }

请注意,这种异或会使指针和双精度等成员无效 - 您甚至不应该从它们中读取这些类型,除非您再次异或以恢复原始值。

于 2012-07-17T10:02:14.037 回答