#include <stdio.h>
#include <stdint.h>

// Исходный массив
uint8_t N[] = {1, 202, 43, 174, 115, 77, 121, 98, 77, 115, 174, 43, 202, 1};

// Битовые маски 
uint8_t B[8] = {1, 2, 4, 8, 16, 32, 64, 128};

// Накопители
uint8_t A[8] = {0, 0, 0, 0, 0, 0, 0, 0};

// По`xor`енные числа массива
uint8_t NXored = 0;

// Искомые числа
uint8_t X, Y;

int main(void) {
	// Проходим по массиву
	for (size_t i = 0; i < sizeof(N); i++) {
		// Если j-й бит числа N[i] установлен в 1... 
		for (size_t j=0; j < 8; j++) {
			if (N[i] & B[j]) {
				// `xor`им j-й накопитель с числом из массива
				A[j] = A[j] ^ N[i];
			}
		}
		// `xor`им все числа
		NXored = NXored ^ N[i];
	}
	
	printf("NXored = %u\n", NXored);
	printf("A = {%u, %u, %u, %u, %u, %u, %u, %u}\n", A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7]);
	
	// Просматриваем накопители
	for (size_t j=0; j < 8; j++) {
		// Если значение в накопителе отличается от нуля и от NXored, то это одно из искомых чисел
		if ( (A[j] != NXored) && A[j] != 0) {
			X = A[j];
			// Второе вычисляем
			Y = A[j] ^ NXored;
			break;
		}
	}
	
	printf("X = %u, Y = %u\n", X, Y);
	
	return 0;
}
