mikrocontroller.net

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


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)
  int_p = 13;
  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...

Autor: Marvin S. (demo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie waers mit
  int_p = 13;
  int_cnt = (int_p + 1)/ 2;

Gruesse

Marvin

Autor: Stefanie B. (sbs)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan B.:

Für die gegebene Verwendung sollte es eher sowas sein:
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael M. (Gast)
Datum:

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

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.