^ Detaillierte Erklärung des Operators (Bitweises XOR).

Weil ich es nicht weiß, gebe ich mein Bestes

Inhaltsverzeichnis

Beispiel 1. Realisieren Sie den Austausch zweier Zahlen 

Beispiel 2. Finden Sie einzelne Hunde

1. Einfache Version

2. Erweiterte Version


  Hallo zusammen, ich bin Ji Ning. In diesem Blog werden der ^-Operator und seine Anwendungsfälle vorgestellt.

Bitweise Operatoren arbeiten mit dem Zweierkomplement der Operanden. ^ ist eine Art bitweiser Operator, der als bitweiser XOR-Operator bezeichnet wird. Das Berechnungsergebnis ist, dass die Binärbits der entsprechenden Operanden gleich 0 sind und die Differenz 1 beträgt.

  Es gibt auch einige Operationsregeln, die denen der Addition und Subtraktion in Bitoperatoren ähneln. Wenn beispielsweise eine Zahl bitweise mit 0 XOR-verknüpft wird, kann die Zahl selbst erhalten werden, und eine Zahl kann mit sich selbst bitweise XOR-verknüpft werden, um 0 zu erhalten, und Das gleiche bitweise XOR kann erhalten werden. Operationen unterstützen auch kommutative Gesetze, wie zum Beispiel: a^b^a=a^a^b.

Beispiel 1. Realisieren Sie den Austausch zweier Zahlen 

Dies ist eine perverse Interviewfrage:
  Sie können keine temporäre Variable (die dritte Variable) erstellen, um zwei Zahlen auszutauschen 

  Bevor wir den bitweisen XOR-Operator lernen, denken wir vielleicht über die folgenden Methoden nach: 

    int a = 2;
    int b = 3;
    printf("交换前:a = %d, b= %d\n", a, b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("交换后:a = %d, b= %d", a, b);

  Unter normalen Umständen kann diese Methode korrekte Ergebnisse liefern. Wenn a und b jedoch sehr groß sind, überschreitet a + b möglicherweise den Speicherbereich und wird abgeschnitten, und der obige Code kann überlaufen.

  Das Überlaufproblem lässt sich sehr geschickt mit der Methode des bitweisen XOR lösen.

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d b = %d\n", a, b);
	return 0;
}

  Weil a^a=0, a^0=a, also a^b^a=a^a^b=0^b=b, auch b^a^b=a. Den Austausch von a und b geschickt umgesetzt

Beispiel 2. Finden Sie einzelne Hunde

1. Einfache Version

  Es gibt ein Array, in dem nur ein Array einmal vorkommt und die restlichen Zahlen paarweise erscheinen. Bitte suchen Sie die Zahl, die nur einmal vorkommt

Zum Beispiel 1 2 3 4 5 1 2 3 4, der einzelne Hund ist 5

  Die Idee besteht darin, eine bitweise XOR-Operation für alle Zahlen im Array durchzuführen, da das XOR das Kommutativgesetz unterstützt und das bitweise XOR-Ergebnis derselben Zahl 0 ist, da es nur einen „einzelnen Hund“ gibt, also das Ergebnis des bitweisen XOR ist „Single Dog“.

int find_single_dog1(int arr[], int sz)
{
	int i = 0;
	int ret = 0;
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int dog = find_single_dog1(arr, sz);
	printf("%d\n", dog);
	return 0;
}

2. Erweiterte Version

  In einem Array kommen nur zwei Zahlen einmal vor, alle anderen Zahlen kommen zweimal vor. Schreiben Sie eine Funktion, um die beiden Zahlen zu finden, die nur einmal vorkommen. Die Elemente des Arrays sind beispielsweise: 1, 2, 3, 4, 5, 1, 2, 3, 4, 6. Nur 5 und 6 kommen nur einmal vor und 5 und 6 müssen gefunden werden.

  Die Idee, zwei „Einzelhunde“ zu finden, besteht darin, die beiden Einzelhunde in zwei Gruppen aufzuteilen und jede Gruppe zusätzlich zu den Einzelhunden ein oder mehrere Zahlenpaare zu haben. Dann wird die Gruppierung zum Schlüssel, um die „einzelnen Hunde“ herauszufinden.

  Zuerst werden alle Zahlen im Array bitweise XOR-verknüpft, da andere Zahlen paarweise vorliegen. Gemäß dem Austauschgesetz der bitweisen XOR-Verknüpfung ist das Ergebnis der bitweisen XOR-Verknüpfung derselben Zahl 0, das Ergebnis der bitweisen XOR-Verknüpfung aller Zahlen ist das Ergebnis des bitweisen XOR zweier „Singletons“.

  Finden Sie das Bit, das in diesem Ergebnis als 1 vom niedrigsten Bit an erscheint. Gemäß der Regel des bitweisen XOR beträgt die Differenz 1, sodass dieses Binärbit zum Schlüssel der Gruppierung werden kann.

  Jede Zahl beurteilt dieses Binärbit, 0/1, und wird in zwei Gruppen unterteilt. Gleichzeitig werden auch die einzelnen Hunde in zwei Gruppen unterteilt und die „einzelnen Hunde“ gefunden.

#include<stdio.h>
void find_single_dog2(int arr[], int sz, int* s1, int* s2)
{
	int i = 0;
	int ret = 0;
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)
		{
			pos = i;
			break;
		}
	}
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
			(*s1)^= arr[i];
	}
	*s2 = ret^(*s1);
}
int main()
{
	int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };
	int dog1 = 0;
	int dog2 = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	find_single_dog2(arr, sz, &dog1, &dog2);
	printf("dog1:%d,dog2:%d", dog1, dog2);
	return 0;
}

Fügen Sie hier eine Bildbeschreibung ein

  Der Blogger schreibt schon lange. Wenn Sie dem Blogger eine kostenlose Dreifachkombination geben können, um ihn zu ermutigen, dann finde ich Ihre Thai-Hose wirklich scharf! ! !

Ich denke du magst

Origin blog.csdn.net/zyb___/article/details/131855681
Empfohlen
Rangfolge