2012-07-17 4 views
0

에 내가 뭘 원하는 D 문자열, INT를 포함하는 배열 인 즉, C++에서 같은 구조체의 두 변수,비트 단위 XOR은 C에서 구조체 ++

D[i] ^= D[j]; 

에 비트 XOR입니다 ....

그러나, 컴파일러는 불평 (여기서 D 의미 인덱스로 정수 배열을 사용하여 [dInd을 [유]^= ...) :

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)))’ 

는 생각이 사람이 내가이 문제를 해결 할 수 있는가하는 방법 라인은 비트 XOR을 달성하기 위해?

모든 힌트는 매우 절묘합니다. 미리 감사드립니다, 환호 - 알렉스

답변

3

과부하 구조체의 멤버 :

struct X 
{ 
    X& operator ^= (const X& other) 
    { 
     //... 
     return *this; 
    } 
}; 
+0

와우, 그게 빠르다. 나는 빨리, 고마워! – astriffe

+1

그리고 D [i]^D [j]를 쓰려면 다음 연산자를 덮어 쓸 수 있습니다. 'X 연산자^(const X & b1, const X & b2);' –

+0

답변을 주셔서 감사합니다! 캡슐화 된 구조체 중 일부는 만져서는 안되며, 오버로딩을 XOR 연산을 수행하는 일부 함수와 혼합합니다. – astriffe

1

그것은 조금 까다로운 ... 당신이 중 하나를 수행 할 수 있습니다 XOR은 XOR의 데이터의 연속 영역으로 구조를 재 해석에 의해입니다 또는 각 데이터 멤버를 차례로 XOR하는 방법에 대해 생각해보십시오. 두 가지 방법 모두 고려해야 할 문제가 있으며, 그 이유는 무엇을하는지에 따라 다릅니다. 예를 들어

:

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++; 
    } 
}; 

v.s. 원래 값을 복원하기 위해 다시 약하게하지 않았다면 당신도 그 종류로 읽기 안 -이 XOR 연산은 포인터와 복식 형상 부재를 무효화하는 것이

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. 
    } 

참고.

+0

답장을 위해 @TonyDelroy에게 감사드립니다! 지금 당장 붙어있는 문제입니다. XOR char * []의 길이가 다른 것 같습니다. 더 짧은 것은 '누락 된'비트에 제로 비트를 가질 것입니다 ... – astriffe

+0

그건 그렇고 Shouln't는 ++이고 j ++는 코드에 있습니다. 두 번째 요소 인 my_int_array [1]부터 시작하겠습니까? – astriffe

+0

@astriffe : 이미 XOR의 부작용이 아닌 루프 증가 명령문에 있습니다. 코드를 스크롤하여 볼 수 있습니다. (Sa에 성가시다. fari 어디 스크롤바가 있지만, 일반적인 두 손가락 드래그 작품). –