Ausführliche Erklärung der Bitoperatoren und einige Tipps zur Bitoperation

Informieren Sie sich noch heute über bitweise Operatoren.

Bildbeschreibung hier einfügen

Viel Spaß beim Lernen heute!

1. Was sind die Operatoren? Wie benutzt man es?

& Bitweises UND: Bitweise Operation Gleich wie 1 , andere sind 0
| Bitweises ODER: Bitweise Operation Gleich wie 0 , andere sind 1
^ Bitweises XOR: Bitweise Operation Differenz
ist 1, gleich 0 ~ Negation : Bitweise Umkehrung (unärer Operator)
<< Verschiebung nach links: Verschiebung nach links bitweise nach links , um 0 zu ergänzen
>> Verschiebung nach rechts: bitweise Verschiebung nach rechts vorzeichenbehaftet, um das höchste Bit zu ergänzen Vorzeichenbit, füllen Sie 0 für Zahlen ohne Vorzeichen .
Bis auf die Negation von ~ ist alles andere ein binärer Operator.

2. Auf welche Datentypen sind bitweise Operatoren anwendbar?

Die Antwort ist, dass es nur für die Integer-Familie gilt, nicht für die Fließkomma-Familie.
Der wesentliche Grund liegt darin, dass die Datenspeichertypen der beiden unterschiedlich sind.
Die Lagerung der Kunststofffamilie wurde im vorherigen Artikel erwähnt, daher werde ich sie nicht wiederholen.

  • Die Speichermethode der Integer-Familie
    Die Speichermethode der Floating-Point-Familie muss den Bestimmungen von IE754 entsprechen.

3. Beispiel für bitweises und bitweises oder bitweises XOR

Beispiel 1: Finden Sie die Anzahl der Einsen in Binärform. Nimm & (bitweises UND)

    int a = 0;
	scanf("%d", &a);
	int count = 0;
	while (a)
	{
    
    
		a = a&(a - 1);//每次把最低位丢弃,直到a为0.
		count++;
	}
	printf("%d\n", count);

Beispiel 2: Finden Sie die Anzahl der Nullen binär mit | (bitweises ODER), (sehr interessant, Sie können es sich ansehen)

	int a = 0;
	int count = 0;
	scanf("%d", &a);
 	while (a+1)
	{
    
    
		a = a | (a + 1);
		count++;
	}
	printf("%d\n", count);

Dieser Code ist sehr interessant, er verwendet das Abschneiden nach dem Datenüberlauf, um die Beurteilungsbedingung wahr zu machen.
Zunächst einmal wird a+1 in der Beurteilung verwendet, weil 0 enthalten sein muss.Eher zufällig passiert es, wenn a+1 gleich 0 ist, dass a -1 ist.Wir wissen, dass es im Zweierkomplement keine 0 gibt von -1. , also passt es gerade. Dies wird verwendet, um ein Bit gleichzeitig zu 1 zu machen und die Daten schließlich negativ (-1) zu machen, 1 zu 0 zu addieren und die Schleife zu beenden.

Beispiel 3: Verwenden Sie ^ (bitweises exklusives ODER), um die Werte zweier Variablen zu vertauschen.

Zunächst einige der grundlegendsten Schlussfolgerungen kennen:
1. Eine Zahl XOR 0 oder sich selbst.
2. Eine Zahl XOR selbst ist 0
Dies wird aus dem XOR-Konzept abgeleitet.

Schauen wir uns diese Frage noch einmal an, gibt es eine Idee?
Zuerst ein XOR b und dann ein XOR ausführen, was äquivalent zu b = b^ b^a ist.
Auf ähnliche Weise kann a erhalten werden.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("after:%d %d\n", a, b);

Unten ist die Mathematik.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("after:%d %d\n", a, b);

Der größte Vorteil des XOR-Verfahrens gegenüber dem mathematischen Verfahren besteht darin, dass das Überlaufproblem nicht berücksichtigt werden muss: Werden zwei sehr große Zahlen mathematisch verknüpft, kann es zum Überlauf kommen.

4. Linksverschiebung Rechtsverschiebungsoperator

Das Verschieben nach links ist relativ einfach, wobei die High-Bits verworfen und die Low-Bits mit 0 gefüllt werden.
Der Fall der Rechtsverschiebung wird diskutiert:
arithmetische Rechtsverschiebung: Bei vorzeichenbehafteten Zahlen wird das höchste Bit um das Vorzeichenbit ergänzt.
Logische Rechtsverschiebung: Bei vorzeichenlosen Zahlen wird das höchste Bit mit 0 aufgefüllt.

Siehe ein Beispiel:

    int a = -1;
	unsigned int b = -1;
	printf("%d\n", a >> 1);
	printf("%u\n", b >> 1);

Bildbeschreibung hier einfügen
Nach dem Ausführen wird festgestellt, dass zuerst -1 gedruckt wird und dann 2 30 -1.
Analysieren Sie zuerst a>>1, da a eine vorzeichenbehaftete negative Zahl ist, sodass das höchste Bit-Vorzeichen beim Füllen 1 ist, und das letzte Komplement Der Wert ist immer noch alles 1.
Schauen Sie sich b>>1 an, weil b eine Zahl ohne Vorzeichen ist, also wird das höchste Bit beim Füllen von Bits mit 0 gefüllt, und schließlich ist das erste Bit 0 und die anderen sind 1.

Was ist also die Reichweite der Verschiebung?
Zunächst einmal haben die Daten vom Typ int nur 32 Bit, also beträgt die maximale Verschiebung 31 Bit, was ist also mit dem Mindestwert? Ist der Mindestwert **-31 Bit? **Nein, weder Links- noch Rechtsverschiebung können negative Bits verschieben.
Der Verschiebungsbereich beträgt also 0 bis 31 Bit.

Sehen wir uns ein Beispiel
für ein Priorisierungsproblem an.

    int a = 1;
	a = a << 2 + 3;
	printf("%d", a);

Zunächst einmal ist das Ergebnis 32, also wenn man es so betrachtet, ist es zuerst (2+3) und dann wird die Verschiebung durchgeführt.
Daher müssen wir bei der Verwendung des Schichtzeichens die Frage der Priorität berücksichtigen.

5. Schichtbetreiberanwendung

Bitweise Position kann mit dem Shift
-Operator auf 0 oder 1 gesetzt werden Bitweise auf 1 gesetzt.

    unsigned int a = 1;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		a = a|(a << i);
	}
	printf("%d", a);

Da das letzte eine vorzeichenbehaftete Zahl ist, wird es als -1 ausgegeben.

nach und nach auf 0 setzen

    unsigned int a = -1;
	for (int i = 0; i < 32; i++)
	{
    
    
		a = a & (a >> i);

	}
	printf("%d", a);

Da a eine Zahl ohne Vorzeichen ist, wird beim Komplementieren von Bits 0 hinzugefügt, und nach dem Verschieben wird ein bitweises ODER ausgeführt. Der letzte Ausdruck ist 0.

6. Einige Tipps

  1. x&1 == 0 Um zu beurteilen, ob es gerade ist, ist das letzte Bit der geraden Zahl 0.
  2. Die Werte zweier Zahlen können per XOR ausgetauscht werden.
  3. x & (x-1) kann eine 1 auf dem Bit ganz rechts zu einer 0 machen.
  4. Bei positiven Zahlen soll x&(x-1)==0 beurteilen, ob es sich um eine Potenz von 2 handelt.
  5. XOR zwei identische Zahlen, das Ergebnis ist 0, und XOR eine Zahl mit 0, das Ergebnis ist es selbst. Kann verwendet werden, um Zahlen zu finden.

7. Die nächste Benachrichtigung

Diese Ausgabe hat das ++-Zeug noch nicht fertig geschrieben. In der nächsten Ausgabe werde ich über ++ und – verwandtes Wissen sprechen.
Die nächste Ausgabe wird spannender~~~
Bildbeschreibung hier einfügen

Ich denke du magst

Origin blog.csdn.net/m0_64770095/article/details/124022347
Empfohlen
Rangfolge