wake-up-neo.com

Was macht eine bitweise Verschiebung (links oder rechts) und wofür wird sie verwendet?

Ich habe die Operatoren >> Und << In verschiedenen Codes gesehen, die ich mir angesehen habe (von denen ich keinen wirklich verstanden habe), aber ich frage mich nur, was sie tatsächlich tun und was manche praktische Verwendungen von ihnen sind.

EDIT

Wenn die Verschiebungen wie x * 2 Und x / 2 Sind, was ist der wirkliche Unterschied zur tatsächlichen Verwendung der Operatoren * Und /? Gibt es einen Leistungsunterschied?

63
The.Anti.9

Hier ist ein Applet , in dem Sie einige Bitoperationen ausführen können, einschließlich des Verschiebens.

Sie haben eine Sammlung von Teilen und bewegen einige von ihnen über ihre Grenzen hinaus:

1111 1110 << 2 
1111 1000 

es wird von rechts mit frischen Nullen gefüllt. :)

0001 1111 >> 3 
0000 0011 

von links gefüllt. Ein Sonderfall ist die führende 1. Sie gibt häufig einen negativen Wert an - abhängig von Sprache und Datentyp. So oft wird gewünscht, dass das erste Bit so bleibt, wie es ist, wenn Sie nach rechts schalten.

1100 1100 >> 1
1110 0110 

und es bleibt über mehrere Schichten erhalten:

1100 1100 >> 2
1111 0011

Wenn Sie nicht möchten, dass das erste Bit erhalten bleibt, verwenden Sie (in Java, Scala, C++, C afaik usw.) einen Triple-Sign-Operator:

1100 1100 >>> 1
0110 0110 

In der anderen Richtung gibt es kein Äquivalent, weil es keinen Sinn ergibt - vielleicht in Ihrem ganz speziellen Kontext, aber nicht generell.

Mathematisch ist eine Linksverschiebung a * = 2, 2 Linksverschiebungen a * = 4 und so weiter. Eine Rechtsverschiebung ist a/= 2 und so weiter.

47
user unknown

Verschiebung des linken Bits, um mit einer Zweierpotenz zu multiplizieren, und Verschiebung des rechten Bits, um mit einer Zweierpotenz zu dividieren. Beispielsweise x = x * 2; kann auch geschrieben werden als x<<1 oder x = x*8 kann geschrieben werden als x<<3 (da 2 hoch 3 ist 8). Ähnlich x = x / 2; ist x>>1 und so weiter.

35
Nitish

Linksverschiebung

x = x * 2^value (normale Operation)

x << value (bitweise Operation)


x = x * 16 (das ist das gleiche wie 2^4)

Das linke Verschiebungsäquivalent wäre x = x << 4

Rechte Shifttaste

x = x / 2^value (normale arithmetische Operation)

x >> value (bitweise Operation)


x = x / 8 (das ist das gleiche wie 2^3)

Das richtige Verschiebungsäquivalent wäre x = x >> 3

24
loyola

Linksverschiebung: Dies ist das Produkt aus dem Wert, der verschoben und 2 hochgesetzt werden muss, um die Anzahl der zu verschiebenden Bits zu bestimmen.

Beispiel

1<<3
0000 0001  ---> 1
Shift by 1 bit
0000 0010 ----> 2 which is equal to 1*2^1
Shift By 2 bits
0000 0100 ----> 4 which is equal to 1*2^2
Shift by 3 bits
0000 1000 ----> 8 which is equal to 1*2^3

Rechtsverschiebung: Dies ist der Quotient des Wertes, der um 2 erhöht werden muss, um die Anzahl der zu verschiebenden Bits zu erhöhen.

Beispiel

8>>3
0000 1000  ---> 8 which is equal to 8/2^0
Shift by 1 bit
0000 0100 ----> 4 which is equal to 8/2^1
Shift By 2 bits
0000 0010 ----> 2 which is equal to 8/2^2
Shift by 3 bits
0000 0001 ----> 1 which is equal to 8/2^3
14
Raghu

Die Bitverschiebungsoperatoren sind im Vergleich zu/oder * effizienter. In der Computerarchitektur benötigt das Dividieren (/) oder Multiplizieren (*) mehr als eine Zeiteinheit und das Register, um das Ergebnis zu berechnen, während der Bitschiebeoperator nur aus einem Register und einer Zeiteinheit besteht.

3
Shobhit Raj

Das linke Bit wird verschoben, um es mit einer Zweierpotenz zu multiplizieren. Das rechte Bit wird verschoben, um es durch eine Zweierpotenz zu teilen.

x = x << 5; // Left shift
y = y >> 5; // Right shift

In C/C++ kann geschrieben werden als:

#include <math.h>

x = x * pow(2, 5);
y = y / pow(2, 5);
3
Pabitra Dash

Einige Beispiele:

  • Bitoperationen zum Beispiel Konvertieren von und nach base64 (das sind 6 Bits statt 8)
  • macht 2 Operationen (1 << 4 gleicht 2^4 d. h. 16)
  • Schreiben von besser lesbarem Code beim Arbeiten mit Bits. Definieren Sie beispielsweise Konstanten mit 1 << 4 oder 1 << 5 ist besser lesbar.
2
Aliostad

Ja, ich denke, was die Leistung angeht, könnten Sie einen Unterschied feststellen, da bitweise Links- und Rechtsverschiebungsoperationen mit einer Komplexität von o(1) mit riesigen Datenmengen ausgeführt werden können.

Für zB Rechenleistung von 2 ^ n: -

int value = 1;
while (exponent<n)
    {
       //print out current power of 2
        value =value *2; // equivalent machine level left shift bit wise operation
        exponent++;
         }
    }

Ein ähnlicher Code mit bitweiser Linksverschiebung wäre wie folgt:

value = 1 << n;

Darüber hinaus entspricht die Ausführung einer bitweisen Operation der exakten Nachbildung von mathematischen Operationen auf Benutzerebene (dies sind die endgültigen Anweisungen auf Maschinenebene, die vom Mikrocontroller und Prozessor verarbeitet werden).

2
user4463890

Hier ist ein Beispiel:

#include"stdio.h"
#include"conio.h"

void main()
{
    int rm,vivek;
    clrscr();
    printf("enter the any numbers\t(e.g)1,2,5");
    scanf("%d",&rm);//rm=5(0101)<<2(two step add zero's)so,value is 10100
    printf("this lift shitf value%d=%d",rm,rm<<4);
    printf("this right shitf value%d=%d",rm,rm>>2);
    getch();
}
0
R.M.VIVEK Arni