fork(10) download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. // Исходный массив
  5. uint8_t N[] = {1, 202, 43, 174, 115, 77, 121, 98, 77, 115, 174, 43, 202, 1};
  6.  
  7. // Битовые маски
  8. uint8_t B[8] = {1, 2, 4, 8, 16, 32, 64, 128};
  9.  
  10. // Накопители
  11. uint8_t A[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  12.  
  13. // По`xor`енные числа массива
  14. uint8_t NXored = 0;
  15.  
  16. // Искомые числа
  17. uint8_t X, Y;
  18.  
  19. int main(void) {
  20. // Проходим по массиву
  21. for (size_t i = 0; i < sizeof(N); i++) {
  22. // Если j-й бит числа N[i] установлен в 1...
  23. for (size_t j=0; j < 8; j++) {
  24. if (N[i] & B[j]) {
  25. // `xor`им j-й накопитель с числом из массива
  26. A[j] = A[j] ^ N[i];
  27. }
  28. }
  29. // `xor`им все числа
  30. NXored = NXored ^ N[i];
  31. }
  32.  
  33. printf("NXored = %u\n", NXored);
  34. 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]);
  35.  
  36. // Просматриваем накопители
  37. for (size_t j=0; j < 8; j++) {
  38. // Если значение в накопителе отличается от нуля и от NXored, то это одно из искомых чисел
  39. if ( (A[j] != NXored) && A[j] != 0) {
  40. X = A[j];
  41. // Второе вычисляем
  42. Y = A[j] ^ NXored;
  43. break;
  44. }
  45. }
  46.  
  47. printf("X = %u, Y = %u\n", X, Y);
  48.  
  49. return 0;
  50. }
  51.  
Success #stdin #stdout 0s 2156KB
stdin
Standard input is empty
stdout
NXored = 27
A = {121, 98, 0, 121, 121, 27, 27, 0}
X = 121, Y = 98