# Problem mit Modulo



## Ishildur (13. Jul 2008)

Hallo zusammen
Also im Fach "Diskrete Mathematik" haben wir gelernt, dass -1 mod 8 = 7 ergibt. Java ist aber offenbar der Ansicht, dass dies -1 erbibt. Gibt es in Java eine "richtige" Modulo Funktion?

Lg Ishildur


----------



## SchonWiederFred (13. Jul 2008)

Nein, in Java gibt es nur den Remainder-Operator %, keinen Modulo-Operator. Kleiner Trick:


```
int x = -1;
int m = ((x % 8) + 8) % 8;
```

Bei der 8 geht es noch einfacher, weil es eine Zweierpotenz ist:


```
int x = -1;
int m = x & 7;
```


----------



## Ishildur (14. Jul 2008)

Hä, kannst du mir das kurz erläutern? Irgendwie ist mir grad nicht klar, wieso das funktioniert!  :?


----------



## SlaterB (14. Jul 2008)

..

modulo hat offensichtlich keine große Lust dazu, negative Zahlen positiv zu machen,
also einfach eine Periodenlänge draufaddieren (+8),

da die vorherige Zahl auch positiv sein könnte (aus +2 wird +10) am Ende nochmal % 8

das andere ist eine Bitoperation, die -1 in 7 umwandelt, -2 in 6 usw.,
positive Zahlen werden nicht geändert,
passt zufällig weil 8 eine Zweierpotenz ist, hat sonst nicht direkt was damit zu tun
(obwohl es in der Theorie der Zahlen sicherlich zig Erklärungs-Verbindungen gibt)


----------



## SchonWiederFred (14. Jul 2008)

SlaterB hat gesagt.:
			
		

> ..
> das andere ist eine Bitoperation, positive Zahlen werden nicht geändert,


Doch! 10 & 7 ist z.B. 2.


----------



## SlaterB (14. Jul 2008)

du musst Gedanken zitieren, nicht nur Texte 


			
				SlaterB hat gesagt.:
			
		

> ..
> das andere ist eine Bitoperation, positive Zahlen [im fraglichen Bereich 0-7] werden nicht geändert,


----------



## SchonWiederFred (14. Jul 2008)

Wenn die Zahlen bereits im Bereich 0-7 wären, dann bräuchte der Fragesteller die Mod-Operation ja gar nicht


----------



## SlaterB (14. Jul 2008)

hey, der Vorschlag kam doch von dir, muss ich ihn dir jetzt erklären?
dass am Anfang %8 ist klar, dann hat man -7 bis +7 und dann entweder +8 %8 oder eben & 7


----------



## Gast (14. Jul 2008)

> Code:
> int x = -1;
> int m = ((x % 8) + 8) % 8;



Das funtioniert aber auch nur weil du -1 verwendest. Würde die Zahl kleiner als -8 sein, würde es nicht mehr funktionieren.


----------



## SlaterB (14. Jul 2008)

willst du diese mir unverständliche Aussage auch begründen?
-9 geht, Aussage widerlegt


----------



## SchonWiederFred (14. Jul 2008)

SlaterB hat gesagt.:
			
		

> hey, der Vorschlag kam doch von dir, muss ich ihn dir jetzt erklären?
> dass am Anfang %8 ist klar, dann hat man -7 bis +7 und dann entweder +8 %8 oder eben & 7


Nein nein, so hab ich das nicht gemeint. Das &7 kann man ganz autonom verwenden ohne ein vorheriges %8.


```
int x = -42; 
int m = x & 7;
```


----------



## SlaterB (15. Jul 2008)

ah ok, noch besser


----------



## 0x7F800000 (6. Okt 2011)

Ishildur hat gesagt.:


> Hallo zusammen
> Also im Fach "Diskrete Mathematik" haben wir gelernt, dass -1 mod 8 = 7 ergibt. Java ist aber offenbar der Ansicht, dass dies -1 erbibt.


Könnte das nicht daran liegen, dass -1 = 7 mod 8 ist? :bloed:

Warum das nicht standardmäßig auf die positiven Representanten aus {0, ...,  n - 1} normiert wird, liegt einfach daran, dass es leichter in der hardware zu implementieren ist, und man den Operator eh in 99.999% nur auf positive Zahlen anwendet. Wer's auch für negative Zahlen braucht, der möge eine zusätzliche if-abfrage einbauen.


----------



## darekkay (7. Okt 2011)

Der TO wird nach 2 Jahren bestimmt über deine Antwort erfreut sein


----------



## 0x7F800000 (7. Okt 2011)

darekkay hat gesagt.:


> Der TO wird nach 2 Jahren bestimmt über deine Antwort erfreut sein


Hoppla... Ich bin einfach aus diesem Thread hier entgleist und auf die Gegenfahrbahn geraten


----------

