Bitweiser Operator für positive und negative Zahlen

8
%Vor%

Ich lerne von meinem Lehrer, dass & gt; & gt; 1 die Zahl durch zwei teilt. Es funktioniert bei positiver Zahl, funktioniert aber nicht bei negativen Zahlen. Kann mir jemand das erklären?

Danke

    
Computernerd 13.12.2012, 11:14
quelle

7 Antworten

6

Als BЈoviћ & amp; mystische Zustände, die Bit-Shift-Operatoren für negative Zahlen verwenden, ist die Implementierung definiert.
Der Grund dafür ist, dass C nicht zwischen logischer und arithmetischer Bitverschiebung unterscheidet (Arithmetische Pads mit dem höchstwertigen Bit, logische Pads mit Nullen)
für positive Zahlen ist dies egal, denn sowohl die arithmetischen als auch die logischen Bitverschiebungen würden das höchstwertige Bit als 0 behalten:
Arithmetik 5 & gt; & gt; 1
0000 0000 0000 0101 = 5
zu
0000 0000 0000 0010 = 2

Logisch 5 & gt; & gt; 1
0000 0000 0000 0101 = 5
zu
0000 0000 0000 0010 = 2

jedoch mit einer negativen Zahl (2's comp)
Arithmetik -5 & gt; & gt; 1
1111 1111 1111 1011 = -5
zu
1111 1111 1111 1101 = -3

Logisch -5 & gt; & gt; 1
% co-de% = -5
zu
1111 1111 1111 1011 = 32.765

oder zumindest, das ist, wie ich es verstehe

    
Daboyzuk 13.12.2012, 11:38
quelle
5
  

Es funktioniert auf positive Zahl, aber es funktioniert nicht auf negative Zahlen.

Bei Verwendung von Shift-Operatoren für negative Ganzzahlen wird die Implementierung definiert.

[expr.shift] / 3 sagt folgendes:

  

Der Wert von E1 & gt; & gt; E2 ist E1 nach rechts verschobene E2-Bitpositionen. Wenn E1 einen vorzeichenlosen Typ hat oder wenn E1 einen vorzeichenbehafteten Typ und einen nicht negativen Wert hat, ist der Wert des Ergebnisses der ganzzahlige Teil des Quotienten von E1 / 2E2. Wenn E1 einen Typ mit Vorzeichen und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert.

    
BЈовић 13.12.2012 11:17
quelle
1

Vor allem,
5 binär ist 0000 0000 0000 0101 aber was ist mit -5? Hier ist es:

  1. Ändere 1 zu 0 und 0 zu 1, dann erhalten wir 1111 1111 1111 1010
  2. Dann nimm die Nummer + 1, wir erhalten 1111 1111 1111 1011

Jetzt erhalten wir: -5 = 1111 1111 1111 1011 (es ist in Zweierkomplementform)
So, hier ist, wie man -5 & lt; & gt; 1:

berechnet
  1. Bewege jedes Bit von -5 von links nach rechts (& gt; & gt;), wir erhalten 111 1111 1111 1101 (nur noch 15 Bits übrig)
  2. Da -5 eine negative Zahl ist, müssen wir das erste Bit mit "1" füllen, damit es zu 16 Bits wird Dann erhalten wir 1111 1111 1111 1101 (es ist immer noch in Zweierkomplementform)
  3. Konvertiere es nun in eine normale binäre Form, indem du 0 zu 1, 1 zu 0 änderst (außer dem ersten Bit, weil es eine negative Zahl im Zweierkomplement definiert), dann plus '1'. So erhalten wir 1000 0000 0000 0011 = -3
SKRUY 18.03.2013 16:22
quelle
1
  

Ich lerne von meinem Lehrer, dass & gt; & gt; 1 die Zahl durch zwei teilt.

Es teilt nicht die ganze Zahl durch zwei, aber es führt aus (abhängig vom Wert)  eine logische oder eine arithmetische Verschiebung um ein Bit nach rechts. Es ist unter Umständen gleichzusetzen mit einer Zweiteilung.

  

Es funktioniert auf positive Zahl, aber es funktioniert nicht bei negativen Zahlen.

Es funktioniert in beiden Fällen, aber das genaue Verhalten wird nicht vom Standard vorgeschrieben, sondern ist implementationsdefiniert. Es teilt sich normalerweise durch zwei und schneidet das Ergebnis gegen die negative Unendlichkeit ab, im Gegensatz zu Null, wie es eine normale Division tun würde.

Als Referenz:

moooeeeep 13.12.2012 12:42
quelle
0

Ich denke, die Antwort ist richtig. Als '/' (Division) -Operator erzeugen Sie den Quotienten (Ergebnis der Division).

In Ihrem Problem:

%Vor%

Das ist also sowohl mit der positiven als auch mit der negativen Zahl in Ordnung.

positive Zahl:

%Vor%

Es ist also gut mit positiver Nummer.

HINWEIS

Bleib niemals eine negative Zahl. Es ist immer positive Zahl.

    
rajesh6115 13.12.2012 11:31
quelle
0

Ich denke die Antwort auf -5 & gt; & gt; 1 = -3. Im Falle einer positiven Zahl, beispielsweise 5, ergibt die Division durch 2 eine Abrundung von 2,5 auf die nächste kleinste ganze Zahl, d. H. 2

Aber wenn wir eine negative Zahl, -5, betrachten, ergibt die Division durch 2 -2.5. Seine Abrundung auf die nächste ganze Zahl ergibt -3.

    
Tanu Saxena 05.08.2013 10:41
quelle
0

In c behält der Operator der rechten Verschiebung das Vorzeichenbit bei. Wenn die Bits nach rechts verschoben werden und das Vorzeichenbit erhalten bleibt, ergibt sich wieder eine negative Zahl, die in zwei Komplementärform vorliegt.

    
prakash kumar 20.09.2013 22:32
quelle

Tags und Links