2009-04-01 6 views

Antwort

19

Verwendung bitweise < < Betreiber:

x = x << 1; 

Diese für integer und lange Zahlen arbeitet (nicht Gleitkommazahlen).

Es verschiebt sich im Grunde die binären Inhalte um eine Position nach links, die von 2

+0

machen Sie mir klar? – sevugarajan

+0

Lesen Sie über Binär in Ihrer eigenen Sprache. 2 ist "10" in binär und drei sind "11". Also binär geschrieben, 3 * 2 = 6 ist wie folgt geschrieben: 11 * 10 = 110, DAS GLEICH ALS LINKE UMSCHALTUNG IST. –

+0

"und lange Zahlen" - was? Ist der lange Datentyp kein Integer? – strager

7

Linksverschiebung der Multiplikation entspricht.

But why would you want to do that? Überlassen Sie diese Art der Optimierung dem Compiler.

Liste der Operatoren und viele Beispiele auf wikipedia.

+0

mache mir viel klar? – sevugarajan

+0

Laut dem Tag ist dies eine Hausaufgabe. –

+2

Dieses Tag wurde nach meiner Antwort hinzugefügt, aber selbst für Hausaufgaben wäre es eine gute Idee, darauf hinzuweisen, dass dies nicht der richtige Weg ist, um Multiplikation in einer höheren Sprache zu machen. –

6

einfach auf kgiannakakis erweitern schreiben:

den Shift-Operator << funktioniert, weil es auf der binären Ebene verlagert - effektiv in der Basis 2. Wie eine Reihe von einem Ort nach links in dezimal bewegt (Basis 10) ist die gleiche wie von 10. beispiels~~POS=TRUNC weise~~POS=HEADCOMP multipliziert:

23 (move to left one digit) = 230 = 23 * 10 

für das Beispiel (unter Verwendung des Präfix 0B Binärzahlen darstellen):

3 * 2 = 6 
0b11 << 1 = 0b110 

Shifting durch andere Zahlen äquivalent von 2 bis Multiplizieren ‚n‘ mal, oder durch 2 bis n-ten Potenz multipliziert (2^n)

3 * 8 = 3 * 2^3 = 24 
0b11 * 8 = 0b11 << 3 = 0b11000 (note the trailing zeros) 

und ein Beispiel in dezimalem es zu beenden:

23 (move to left 3 places) = 23 * 1000 = 23 * 10^3 = 23000 
5

Vorsicht: Shifting möglicherweise nicht für signierte Variablen arbeiten,

int x; 
int tmp; 

if (x < 0) { 

    tmp = -x; 
    tmp = tmp << 1; 
    x = -tmp; 
} 
else { 

    x = x << 1; 
} 
+0

Im Allgemeinen, wenn Sie mit signierten Variablen zu tun haben, möchten Sie genau wissen, was Sie gerade tun, und sollten in der Regel Bit-Manipulationen vermeiden. Wenn ich mit Schichten multiplizieren müsste, würde ich wahrscheinlich das Vorzeichen als ein separates Zeichen behalten und sicherstellen, dass es wieder eingefügt wird. Oder schreibe es in reiner Versammlung und missbrauche das Tragen-Zeichen. –

+0

In der Regel -ve Zahlen werden gespeichert 2s Kompliment in diesem Fall Verschiebung sollte gut funktionieren und das Vorzeichen Bit beibehalten. Sie haben immer noch Probleme mit dem Überlauf, aber das ist auch bei der geraden Multiplikation der Fall. –

0

Nur um sicherzustellen, dass wir alle klar sind, dies zu tun, wie jeder hat vorgeschlagen, bitwis e Verschiebung nach links (< <)

Jedes Mal, wenn Sie nach links verschieben, multiplizieren Sie im Wesentlichen um einen Faktor von zwei.

int x; 
int result; 
x = 5; 

// result = 10 (multiply by a factor of 2 or 2^1=2) 
result = 5<<1; 

//result = 20 (multiply by a factor of 4 or 2^2=4) 
result = 5<<2; 

//result = 40 (multiply by a factor of 8 or 2^3=8) 
result = 5<<3; 
Verwandte Themen