# rechts shift (>>>) einer negativen Zahl



## muspupr0 (12. Nov 2012)

Hallo,

habe folgendes Problem. Ich möchte eine negative Dezimalzahl bzw. Dualzahl nach rechts shiften mit dem Bitweisen Operator >>>.

-100 (Dez) --> 1001 1100 (Dual)



int x=-100, z;

z=x>>>1;

System.out.println(z);


Auf der Konsole wird dann die unrealistische Zahl 1073741799 ausgegeben.

Kann mir evtl. bitte jemand logisch erklären wie ich eine negative Zahl mit dem bitweisen Operator >>> nach rechts shifte!?

Das arithmetische shiften nach rechts/links (>> bzw. <<) mit pos./neg. Zahlen habe ich verstanden und kann ich auch nachvollziehen bzw. anwenden.

Vielen Dank im Voraus!!!


----------



## Paddelpirat (12. Nov 2012)

Guck mal hier: Java ist auch eine Insel – 2.8 Weitere Operatoren


----------



## Ark (12. Nov 2012)

Zweierkomplement ? Wikipedia

Ark


----------



## muspupr0 (12. Nov 2012)

@Paddelpirat: Danke für die schnelle Antwort, unter 2.8.4 sind entsprechend die Verschiebeoperatoren beschrieben, jedoch wird leider das >>>-shiften einer negativen Zahl nicht ausführlich beschrieben...
:-(

Ich bin schon eine längere Zeit am grübeln, aber ich kann es mir leider nicht herleiten.

-64>>>1   --> 2147483616


----------



## Ark (12. Nov 2012)

Zweierkomplement ? Wikipedia
Bitweiser Operator ? Wikipedia

Ark


----------



## muspupr0 (12. Nov 2012)

@Ark: Danke für deine Unterstützung, aber entsprechende Artikel habe ich natürlich vorher schon durchgelesen, jedoch haben mir diese leider auch nicht weiter geholfen. Ansonsten hätte ich diese (vielleicht primitive) Frage auch nicht in diesem Forum gestellt!!

-100 (Dez) --> 1001 1100 (Dual)

1001 1100 >>> 1 --> 0100 1110

Diese Zahl ergibt dann für mich 78 (Dez) und nicht 1073741799 (Dez).
2^1 + 2^2 +2^3 + 2^6=78


Wie gesagt, für eine logische Erklärung wäre ich sehr dankbar! (Keine diversen Artikel!)

Danke


----------



## xehpuk (12. Nov 2012)

```
-100
```
 ist ein 
	
	
	
	





```
int
```
. 
	
	
	
	





```
int
```
 hat 32 Bit, nicht 8 Bit. Daher ist die Binärdarstellung 
	
	
	
	





```
11111111111111111111111110011100
```
 (32 - 8 = 24 "führende" Einsen) und nicht 
	
	
	
	





```
10011100
```
.
Dementsprechend: 
	
	
	
	





```
11111111111111111111111110011100 >>> 1 = 01111111111111111111111111001110
```
Hättest du dir auch mit [JAPI]Integer#toBinaryString(int)[/JAPI] ausgeben lassen können.


----------



## Paddelpirat (12. Nov 2012)

Der Unterschied zwischen >> und >>> ist halt, dass bei >> das Vorzeichen (also die führende 0 oder 1) erhalten bleibt und bei >>> keine Rücksicht auf das Vorzeichen genommen wird und einfach von links eine 0 eingeschoben wird, daher die relativ große positive Zahl als Ergebnis.


----------



## muspupr0 (13. Nov 2012)

@xehpuk: Vielen Dank!

Wenn ich jedoch die Dualzahl: 01111111111111111111111111001110 in eine Dezimalzahl umwandle, komme ich leider auf 2147483598 und nicht auf die 1073741799 wie sie auf der Konsole ausgegeben wird... :-(

Ein Datenüberlauf kann es auch nicht sein, da int bis 2^32 geht (2147483647).


----------



## SlaterB (13. Nov 2012)

?
01111111111111111111111111001110 
ist
01111111-11111111-11111111-11001110 

das ist nahe am Integer.MAX_VALUE, bekanntlich 2 Mrd. irgendwas, ~2^32  ~ 2147483647 wie du es selber sagst,
(edit: also die ausgeschriebene Zahl ist richtig, sind aber nur ~2^31, siehe nächstes Post, eben 31 Bit)
fehlen ja auch nur paar 1en am Ende, die 0 am Anfang ist das Vorzeichenbit


kannst ja selber alles mögliche rechnen, 

```
public class Test2 {
    public static void main(String[] args)  {
        int k = Integer.parseInt("01111111111111111111111111001110", 2);
        System.out.println(k);
        System.out.println("01111111111111111111111111001110");
        System.out.println(Integer.toBinaryString(2147483598));
        System.out.println(Integer.toBinaryString(1073741799));
    }
}
```
usw., sicher keine Offenbarung an Code,
bei fehlenden führenden 0en natürlich aufpassen

ich sehe keinerlei Begründung, warum 01111111111111111111111111001110 nicht genau korrekt 2147483598 sondern 1073741799 sein sollte?


----------



## Trolllllll (13. Nov 2012)

sind die 2^32 nicht nur beim unsignd int, somit sind es nur 2^31 positive Zahlen und 2^31 negative Zahlen, somit wird es bei dem shift also nicht ~2^32 sondern nur ~2^31


----------

