Erste Schritte x*y*z mit Shift Operator moeglich?

ocsme

Top Contributor
Guten Tag,
wir sollen ein Programm schreiben das x*y*z berechnet ohne *.
Ich habe das ganze natürlich einfach so runter gerechnet :p
Java:
int x=5;
        int y=40;
        int z=3;
        int erg1=0;
        int erg2=0;
       
        while(y>0) {
            erg1+=x;
            y--;
        }

        while(z>0) {
            erg2+=erg1;
            z--;
        }
        System.out.println(erg2);

Natürlich tut es was es soll doch ich bin unzufrieden :D wir haben den Shift Operator behandelt und ich würde sehr gerne wissen wie man sowas mit diesem Operator hin bekommt?
Hab schon einiges versucht doch vor allem denke ich man brauch die Binärwerte von x,y und z. Wenn man diese im Programm erst berechnen muss und hin und her umwandeln muss mit Schleifen dann lasse ich es wie es ist das wird ja dann noch mehr als ich jetzt schon habe :D

Kennt da jemand eine Idee?

Danke im voraus :)

LG
 

Tarrew

Top Contributor
Also wenn man "a" und "b" ganz einfach mit Bitshifts multiplizieren will, klappt das nur, wenn entweder a oder b eine Zweierpotenz ist.

Beispiel:
Java:
        int a = 5;
        int b = 16;
     
        System.out.println(a*b);
        System.out.println(a<<(int)(Math.log(b)/Math.log(2)));

Da ein Liniksshift um 1 i.d.R einer Multiplikation mit 2 entspricht.

Ansonsten kann man auch jede Multiplikation als Division umschreiben:
Java:
        int a = 5, b = 16, c = 2;

        System.out.println(a / (1 / (double) b) / (1 / (double) c));

Gibt auch noch andere Algorithmen zur Multiplikation - Stichwort "Russische Bauernmultiplikation" etc - die man mit Hilfe von Bitshifts implementieren kann, aber den einen einfachen Bitshift für so eine Multiplikation gibt es nicht ;)
 

mihe7

Top Contributor
denke ich man brauch die Binärwerte von x,y und z
?!?

x*y*z = a*z mit a = x*y

Wir können das Problem also auf die Multiplikation zweier Zahlen reduzieren.

Schauen wir uns mal x*y für den Fall x = 5 an: Das wäre (2^2 + 2^0) * y, also 2^2 * y + 2^0 * y und damit (y << 2) + y.

Für x = 6 wäre (2^2 + 2^1) * y = 2^2*y + 2^1*y, also (y << 2) + (y << 1).

Für positive(!) Zahlen folgt:
Java:
    int mult(int a, int b) {
        int shift = 0;
        int c = 0;
        while (a > 0) {
            if ((a & 1) == 1) {
                c += (b << shift);
            }
            shift++;
            a >>= 1;
        }
        return c;
    }
 

mihe7

Top Contributor
Wenn ich das richtig sehe, ist das sogar fast genau das, was ich geschrieben habe; ich wusste gar nicht, dass das einen Namen hat :eek:

Der Unterschied besteht darin, dass sich mein "Akkumulator" auf das shift bezieht, das Verdoppeln/Halbieren eben via Shift-Operator gelöst wird und der Modulo-Operator über ein bitweises Und ersetzt wurde.
 
Zuletzt bearbeitet:

ocsme

Top Contributor
WOW vielen Dank für die super schnellen Antworten werde mir nun eins nach dem anderen genauer anschauen :)
Doch leider denke ich das wir diesen netten algorithmus nicht benutzen dürfen :(
Java:
  int mult(int a, int b) {
        int shift = 0;
        int c = 0;
        while (a > 0) {
            if ((a & 1) == 1) {
                c += (b << shift);
            }
            shift++;
            a >>= 1;
        }
        return c;
    }

Da wir die Binären Operatoren mit &, | etc noch nicht hatten :D Ich verstehe auch nicht was das hier überhaupt macht? (a & 1) == 1
Prüft man da binär ab ob das derzeitige Bit eine 1 ist? anderes kann ich mir nicht vorstellen :D nur wieso ?

LG
 

mihe7

Top Contributor
Wenn Du Dir das Beispiel von oben ansiehst, brauchen wir ja die gesetzten Bits einzeln.

Wir könnten jetzt also hergehen und einfach die 1 (2^0) in jeder Iteration um eine stelle nach links verschieben (2^1, 2^2, 2^3, ...) und dann mit Hilfe einer binären UND-Verknüpfung feststellen, ob in der Zahl das entsprechende Bit gesetzt ist.

Genauso gut kann man aber auch die 1 fix lasen und die Zahl nach rechts verschieben.

Am Beispiel der 6
Code:
110 & 001 == 000 == 0
110 & 010 == 010 != 0
110 & 100 == 100 != 0
      ^^^
      links-Shift

110 & 001 == 000 == 0
011 & 001 == 001 != 0
001 & 001 == 001 != 0
^^^
rechts-Shift
Wie man sieht, kommt in beiden Fällen am Ende das gleiche raus.
 
X

Xyz1

Gast
Ahhhhh, schon verstanden, mult(x,mult(y,z))....

Allerdings hast Du immernoch eine Akkumulierungsinkremtierungsaddition dabei, diese lässt sich auch nich vermeiden. :( (Oder?)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Shift Operator Java Basics - Anfänger-Themen 3
M Binärdarstellung in Java mit Shift-Operator + bitweises und Java Basics - Anfänger-Themen 2
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
J bundel - Datei wird nicht gefunden. Trotz STRG-SHIFT-J Java Basics - Anfänger-Themen 2
X Shift-Operatoren Java Basics - Anfänger-Themen 1
M hexadezimal in binär mit Hilfe von Shift-Operatoren Java Basics - Anfänger-Themen 6
M rechts shift (>>>) einer negativen Zahl Java Basics - Anfänger-Themen 10
StrikeTom Shift + pfeiltaste ermitteln Java Basics - Anfänger-Themen 3
U void shift Java Basics - Anfänger-Themen 7
M MenuShortcut nur mittels Shift+Taste Java Basics - Anfänger-Themen 3
G Shift Operatoren Java Basics - Anfänger-Themen 4
pkelod Binäre Darstellung Bitwise-Operator Java Basics - Anfänger-Themen 10
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
C ?: Operator Java Basics - Anfänger-Themen 14
L Java operator % Java Basics - Anfänger-Themen 3
KogoroMori21 Erklärung zum Ternären Operator Java Basics - Anfänger-Themen 4
B Modulo-Operator anhand eines Beispieles erklären Java Basics - Anfänger-Themen 7
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
L Modulus Operator Java Basics - Anfänger-Themen 3
A Zuweisungen und -- operator; Java Basics - Anfänger-Themen 2
H << Operator Java Basics - Anfänger-Themen 7
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
H Operatoren Der bedingte Operator ? : ; Java Basics - Anfänger-Themen 2
J new-Operator Java Basics - Anfänger-Themen 6
H this operator - was ist das? Java Basics - Anfänger-Themen 2
R Operatoren Bad operand types for binary operator Java Basics - Anfänger-Themen 4
O Bedingter Operator eine Frage! Java Basics - Anfänger-Themen 10
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
E Methoden in new-Operator Methode in geschweifter Klammer Java Basics - Anfänger-Themen 3
I bad operand types for binary operator > Java Basics - Anfänger-Themen 5
D Conditional Operator ?: Java Basics - Anfänger-Themen 3
L Operatoren Übungsklausuraufgabe, unbekannter Operator Java Basics - Anfänger-Themen 13
H Operatoren Fehler bad operand types for binary operator Java Basics - Anfänger-Themen 7
snipesss Operator "-" is undefined Java Basics - Anfänger-Themen 1
F Operatoren If mit variabelem Operator Java Basics - Anfänger-Themen 2
J instanceof Operator Java Basics - Anfänger-Themen 3
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
J Operator * benutzen Java Basics - Anfänger-Themen 3
DeVolt Operatoren Frage zum new-Operator Java Basics - Anfänger-Themen 4
N Methoden Modulo Operator Java Basics - Anfänger-Themen 1
S Operatoren ! Operator Java Basics - Anfänger-Themen 4
O Operator undefined Java Basics - Anfänger-Themen 2
N this-Operator Java Basics - Anfänger-Themen 2
ubaro1 Operatoren Der Tide Operator und positive Ganzzahlen in Binär Java Basics - Anfänger-Themen 1
S Hashcode - Operator ^ Java Basics - Anfänger-Themen 11
V XOR-Operator? Java Basics - Anfänger-Themen 5
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
J bad operand types for binary operator Java Basics - Anfänger-Themen 3
T Pixelmanipulation Sobel-Operator Java Basics - Anfänger-Themen 2
K Frage zu Class Operator Java Basics - Anfänger-Themen 2
L The operator && is undefined for the argument type(s) String, boolean Java Basics - Anfänger-Themen 8
C Operatoren | - Operator Java Basics - Anfänger-Themen 10
K .Class Operator unklar Java Basics - Anfänger-Themen 3
B Operator | Java Basics - Anfänger-Themen 11
R Compiler-Fehler Operator + nicht erlaubt? Java Basics - Anfänger-Themen 6
C Was tut der | Operator? Java Basics - Anfänger-Themen 8
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
S Objekt Erzeugung ohne new Operator Java Basics - Anfänger-Themen 6
C Logischer UND Operator funktioniert nicht richtig Java Basics - Anfänger-Themen 5
H Buch: Java lernen mit BlueJ Modulo-Operator Java Basics - Anfänger-Themen 16
K Conditional Operator Java Basics - Anfänger-Themen 16
A Was bedeutet der Operator *= ? Java Basics - Anfänger-Themen 2
A Operator in Java Java Basics - Anfänger-Themen 11
S Modulo Operator Java Basics - Anfänger-Themen 8
C Variablen Problem: variable operator might not have been initialized Java Basics - Anfänger-Themen 9
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
K OOP Wertebereich Ergebnis von % Operator Java Basics - Anfänger-Themen 8
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
R Ersatz für Modulo Operator Java Basics - Anfänger-Themen 8
W &-Operator in diesem Zusammenhang Java Basics - Anfänger-Themen 19
J Oder-Operator Tastenkürzel Java Basics - Anfänger-Themen 7
K Cast-Operator Java Basics - Anfänger-Themen 3
D Bit-Operator & Java Basics - Anfänger-Themen 5
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
V Cast-Operator Java Basics - Anfänger-Themen 2
G super operator und incompatible types, simple fehler Java Basics - Anfänger-Themen 8
N Operator aus Array lesen Java Basics - Anfänger-Themen 2
G Für was braucht man den This-operator Java Basics - Anfänger-Themen 3
W Seltsamer Operator int var = 1<< 23; Java Basics - Anfänger-Themen 4
P If Abfrage, Variablenvertauschung und UND Operator Java Basics - Anfänger-Themen 4
J Modulo-Operator rechnet falsch Java Basics - Anfänger-Themen 2
B + operator Java Basics - Anfänger-Themen 4
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
H Konditional Operator Java Basics - Anfänger-Themen 2
NightmareVirus new operator Java Basics - Anfänger-Themen 5
M %-Operator Java Basics - Anfänger-Themen 3
G string ohne '+' operator Java Basics - Anfänger-Themen 5
S Modulo-Operator Java Basics - Anfänger-Themen 5
S Operator ! auf char nicht anwendbar, was nun? Java Basics - Anfänger-Themen 7
T sobel-operator Java Basics - Anfänger-Themen 3
W %-Operator Java Basics - Anfänger-Themen 4
S Unterschied: ++a & a++ Operator? Java Basics - Anfänger-Themen 9
ven000m Operator += Java Basics - Anfänger-Themen 4
Student Probleme mit dem new-Operator Java Basics - Anfänger-Themen 14
G Operator-Überladung Java Basics - Anfänger-Themen 6
B Operator Java Basics - Anfänger-Themen 2
Z operator ++ Java Basics - Anfänger-Themen 3
N return-Operator Java Basics - Anfänger-Themen 11
M Nach Serializierung kein Zugriff auf Variabeln moeglich Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben