Reconnaître = différent = ou = chance = calculer


Opération XOR: la même chose est 0, la différence est 1 la
même opération OU: la même chose est 1, la différence est 9

La probabilité de se souvenir longtemps est proche de 0%

Alors,L'opération XOR hérite de l'ajout sans report!

La nature de l'opération XOR

1) 0 ^ N = N (la compréhension est plus facile à mémoriser en ajoutant sans report)
2) N ^ N = 0 (plus facile à mémoriser en ajoutant sans report)
3) Le fonctionnement XOR satisfait la loi d'échange et la combinaison Loi (rappelez-vous cette phrase,Cela signifie que le même numéro de lot n'a pas d'importance la commande, le résultat de XOR est le même

Les deux propriétés ci-dessus sont faciles à comprendre en ajoutant uniquement

N & ((~ N) + 1)

Comment extraire un numéro de type int pour extraire le 1 le plus à droite (toutes les autres positions sont 0)? Il s'agit d'une opération de routine dont il faut se souvenir. Voir capture d'écran pour des raisons:

Insérez la description de l'image ici

Le titre

Exemple 1: Il n'y a qu'un seul type de nombre dans un tableau qui apparaît à des moments impairs, d'autres nombres apparaissent à des moments pairs, comment trouver ce nombre et imprimer

public static int findNumber(int[] arr) {
	int eor = 0;
	for (int i : arr) {
		eor = eor ^ i;
	}
	return eor;
}

Exemple 2: il y a deux types de nombres dans un tableau qui apparaissent des temps impairs, d'autres nombres apparaissent des temps pairs, comment trouver et imprimer ces deux nombres

Nous préparons toujours un eor. En arr, supposons que a et b apparaissent des temps impairs, et d'autres nombres apparaissent des temps pairs. Alors le résultat de XORing tous les nombres doit être un aor ou un b: eor = a ^ b. Comme les nombres pairs restants n'interfèrent pas, ils sont tous décalés. Et comme a et b ne sont pas égaux, eor ne doit pas être égal à 0, c'est-à-dire que le nom eor doit avoir 1 en position. En supposant que le plus à droite est la 8ème position, le huitième bit de a doit être différent du huitième bit de b. Par conséquent, l'ensemble du tableau peut être divisé en deux catégories, l'une est le huitième bit est 0, l'autre est le huitième bit est 1, et a et b doivent être dans deux catégories différentes. Préparez un autre eor ', puis traitez l'une des catégories de l'exemple 1 pour obtenir un, puisB = George George '. Ensuite, nous avons juste besoin de changer le huitième bit pour celui à l'extrême droite, et ça va.

Insérez la description de l'image ici

public static void printOddTimesNum2(int[] arr) {
	int eor = 0;
	for (int i=0; i<arr.length; i++) {
		eor ^= arr[i];
	}
	
	int rightOne = eor & ((~eor) + 1);

	int a = 0;
	for (int i=0; i<arr.length; i++) {
		if (arr[i] & rightOne != 0) {
			^= arr[i];
		}
	}
	System.out.print("a:" + a + " b:" + a^eor);
}
A publié 40 articles originaux · Likes0 · Visites 383

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43780400/article/details/105666631
conseillé
Classement