- #include <cstddef> 
- #include <cstdint> 
- #include <iostream> 
-   
- template<size_t bytesLeft> 
- void doXor(void *p1, void *p2) { 
- 	*reinterpret_cast<uint64_t*>(p1) ^= *reinterpret_cast<uint64_t*>(p2); 
- 	doXor<bytesLeft - 8>(reinterpret_cast<uint8_t*>(p1) + 8, reinterpret_cast<uint8_t*>(p2) + 8); 
- } 
- template<> 
- void doXor<0>(void*, void*) {} 
- template<> 
- void doXor<1>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2); 
- } 
- template<> 
- void doXor<2>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2); 
- 	*(reinterpret_cast<uint8_t*>(p1) + 1) ^= *(reinterpret_cast<uint8_t*>(p2) + 1); 
- } 
- template<> 
- void doXor<3>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2); 
- 	*(reinterpret_cast<uint8_t*>(p1) + 1) ^= *(reinterpret_cast<uint8_t*>(p2) + 1); 
- 	*(reinterpret_cast<uint8_t*>(p1) + 2) ^= *(reinterpret_cast<uint8_t*>(p2) + 2); 
- } 
- template<> 
- void doXor<4>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2); 
- } 
- template<> 
- void doXor<5>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2); 
- 	doXor<1>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4); 
- } 
- template<> 
- void doXor<6>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2); 
- 	doXor<2>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4); 
- } 
- template<> 
- void doXor<7>(void *p1, void *p2) { 
- 	*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2); 
- 	doXor<3>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4); 
- } 
-   
- template<typename T> 
- T& operator^=(T& a, T& b) { 
- 	doXor<sizeof(T)>(&a, &b); 
- 	return a; 
- } 
-   
- struct A { 
- 	uint64_t a; 
- 	uint64_t b; 
- 	uint64_t c; 
- 	uint64_t d; 
- }; 
-   
- int main() { 
- 	A a{1,2,3,4}; 
- 	A b{5,6,7,8}; 
-   
- 	std::cout << a.a << " " << a.b << " " << a.c << " " << a.d << std::endl; 
- 	std::cout << b.a << " " << b.b << " " << b.c << " " << b.d << std::endl; 
-   
- 	a ^= b; 
- 	b ^= a; 
- 	a ^= b; 
-   
- 	std::cout << a.a << " " << a.b << " " << a.c << " " << a.d << std::endl; 
- 	std::cout << b.a << " " << b.b << " " << b.c << " " << b.d << std::endl; 
- } 
				I2luY2x1ZGUgPGNzdGRkZWY+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxzaXplX3QgYnl0ZXNMZWZ0Pgp2b2lkIGRvWG9yKHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihwMik7Cglkb1hvcjxieXRlc0xlZnQgLSA4PihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyA4LCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyA4KTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8MD4odm9pZCosIHZvaWQqKSB7fQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8MT4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpIF49ICpyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMik7Cn0KdGVtcGxhdGU8Pgp2b2lkIGRvWG9yPDI+KHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDIpOwoJKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyAxKSBePSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKSArIDEpOwp9CnRlbXBsYXRlPD4Kdm9pZCBkb1hvcjwzPih2b2lkICpwMSwgdm9pZCAqcDIpIHsKCSpyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKTsKCSoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgMSkgXj0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyAxKTsKCSoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgMikgXj0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyAyKTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8ND4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAyKTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8NT4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAyKTsKCWRvWG9yPDE+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAxKSArIDQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKSArIDQpOwp9CnRlbXBsYXRlPD4Kdm9pZCBkb1hvcjw2Pih2b2lkICpwMSwgdm9pZCAqcDIpIHsKCSpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocDEpIF49ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocDIpOwoJZG9Yb3I8Mj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgNCwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDIpICsgNCk7Cn0KdGVtcGxhdGU8Pgp2b2lkIGRvWG9yPDc+KHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihwMik7Cglkb1hvcjwzPihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyA0LCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyA0KTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCYgb3BlcmF0b3JePShUJiBhLCBUJiBiKSB7Cglkb1hvcjxzaXplb2YoVCk+KCZhLCAmYik7CglyZXR1cm4gYTsKfQoKc3RydWN0IEEgewoJdWludDY0X3QgYTsKCXVpbnQ2NF90IGI7Cgl1aW50NjRfdCBjOwoJdWludDY0X3QgZDsKfTsKCmludCBtYWluKCkgewoJQSBhezEsMiwzLDR9OwoJQSBiezUsNiw3LDh9OwoJCglzdGQ6OmNvdXQgPDwgYS5hIDw8ICIgIiA8PCBhLmIgPDwgIiAiIDw8IGEuYyA8PCAiICIgPDwgYS5kIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBiLmEgPDwgIiAiIDw8IGIuYiA8PCAiICIgPDwgYi5jIDw8ICIgIiA8PCBiLmQgPDwgc3RkOjplbmRsOwoKCWEgXj0gYjsKCWIgXj0gYTsKCWEgXj0gYjsKCQoJc3RkOjpjb3V0IDw8IGEuYSA8PCAiICIgPDwgYS5iIDw8ICIgIiA8PCBhLmMgPDwgIiAiIDw8IGEuZCA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgYi5hIDw8ICIgIiA8PCBiLmIgPDwgIiAiIDw8IGIuYyA8PCAiICIgPDwgYi5kIDw8IHN0ZDo6ZW5kbDsKfQ==