Forum: Compiler & IDEs Wenn nicht durch 2 teilbar eins addieren?


von AVRli (Gast)


Lesenswert?

Hi Leute,

ich weiß was passieren muß, aber ich habe keinen Plan wie ich es 
realisieren kann.

Wenn eine Zahl nicht durch 2 teilbar ist dann muss das Ergebnis 1 
addiert werden.

Im Moment mache ich es so... (Beispiel!)
1
  int_p = 13;
2
  int_cnt = int_p / 2;

Das funktioniert so lange wie int_cnt ein gradzahligen Inhalt hat.
Bei 13 kommt so 6 heraus.
7 muss es aber sein für meine weitere Abarbeitung.

Hat jemand eine Idee?

Gruß AVRli...

von Marvin S. (demo)


Lesenswert?

wie waers mit
1
  int_p = 13;
2
  int_cnt = (int_p + 1)/ 2;

Gruesse

Marvin

von Stefanie B. (sbs)


Lesenswert?

Wenn eine zahl durch 2 teilbar ist, ist in Binärdarstellung die letzte 
Stelle eine '0'.
Andernfalls steht da eine '1'

wie wäre es mit
1
zahl |= 1

Damit wird das letzte Bit definitiv auf 1 gesetzt.

Fall 1: Es war schon eine '1' am letzen Bit:
nichts passiert, alles ist gut

Fall 2: aus der '0' wird eine '1':
Das entspricht dem Addieren einer 1 in den gängigen binären 
Zahldarstellungen. Alles ist gut.

Viele Grüße
Stefan

von Di P. (drpepper) Benutzerseite


Lesenswert?

@Stefan B.:

Für die gegebene Verwendung sollte es eher sowas sein:
1
zahl = (zahl & 1) ? (zahl >> 1) + 1 : (zahl >> 1);

So wie ich dienen Vorschlag sehe, wird immer eine ungerade zahl daraus, 
aber das ändert nichts am Abrunden bei der nachfolgenden 
Ganzzahldivision.

von Karl H. (kbuchegg)


Lesenswert?

Marvin S. hat weiter oben schon die richtige Lösung (für positive 
Zahlen) gegeben. Einfach immer 1 addieren und dann durch 2

Bei einer geraden Zahl entsteht so eine ungerade Zahl, bei der 
Ganzzahldivision kommt dann immer noch das richtige raus.

Eine ungerade Zahl hingegen bewirkt die Addition, dass die nächste 
gerade Zahl antsteht und die Division ergibt 'das aufgerundete' 
Ergebnis.

(In Wirklichkeit wird da nichts gerundet. Nachkommastellen werden 
einfach abgeschnitten bzw. sie entstehen erst gar nicht bei der 
Division)

Und bitte:
Wenn du Division meinst, dann schreib auch Division.
Dieses vermeintliche 'Optimieren' durch Schieben kannst du dir sparen. 
Das erledigt der Compiler. Schreib den Code so, dass er zur 
Aufgabenstellung passt.

von Michael M. (Gast)


Lesenswert?

und allgemein: wenn x nicht durch t teilbar ist, addiere a:
if(x%t) x+=a;

von Di P. (drpepper) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> Und bitte:
> Wenn du Division meinst, dann schreib auch Division.
> Dieses vermeintliche 'Optimieren' durch Schieben kannst du dir sparen.
> Das erledigt der Compiler. Schreib den Code so, dass er zur
> Aufgabenstellung passt.

Gute Nacht, schlaf dich am besten mal aus (für die gute Laune :) )

Ich hab nichts von "optimieren" gesagt.
Das Wort "Abrunden" ist Definitionssache.
Marvins Lösung ist besser, weil kein Entscheidungspunkt, und daher kein 
möglicher Sprung enthalten ist.

von Karl H. (kbuchegg)


Lesenswert?

Di Pi schrieb:
> Karl heinz Buchegger schrieb:
>> Und bitte:
>> Wenn du Division meinst, dann schreib auch Division.
>> Dieses vermeintliche 'Optimieren' durch Schieben kannst du dir sparen.
>> Das erledigt der Compiler. Schreib den Code so, dass er zur
>> Aufgabenstellung passt.
>
> Gute Nacht, schlaf dich am besten mal aus (für die gute Laune :) )
>
> Ich hab nichts von "optimieren" gesagt.

Warum benutzt du dann eine Schiebeoperation, anstatt einer Division?

> Das Wort "Abrunden" ist Definitionssache.

Nein, ist es nicht.
Denk an negative Zahlen.
  -2.8  abgerundet ergibt -3
  -2.8  die Kommastellen abgeschnitten, ergibt -2

> Marvins Lösung ist besser, weil kein Entscheidungspunkt, und daher kein
> möglicher Sprung enthalten ist.

Marvins Lösung ist besser, weil es die einfachste Lösung ist, die dazu 
auch noch völlig logisch ist (wenn man die C-Regeln kennt)

von AVRli (Gast)


Lesenswert?

Guten Morgen,

danke für die verschiedenen Lösungen. Ich entschiede mit für Marvins 
Weg.
Das verstehe ich und in meinem Fall kommt es echt nicht auf 
Geschwindigkeit an. Eher darauf das ich in einem halben Jahr noch sehe 
was da passiert. ;-)

Gruß AVRli...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.