Nächste Vielfache von 8 ohne Kontrollstruktur berechnen?
-
Versteh dich nicht!
-
int x = (Zahl+7) - (Zahl+7)%8; //oder int x = ((Zahl+7)/8)*8;
Berechnen beide das nächstgrößere Vielfache von 8 (das war doch das Problem, oder sehe ich das falsch?)
-
So gehts natürlich auch hab anfangs nicht verstanden was du willst
-
y=y%10%9%8%7%6%5%4;
Das sollte nur mein ungläubiges Staunen über diese sehr interessante Formel zum Ausdruck bringen
-
Deine Formel ist zwar kürzer als meine, meine verteht man aber dafür nicht gleich!
-
Das stimmt, ist manchmal durchaus von Vorteil
-
#include <stdio.h> int main() { int i; scanf("%d",&i); printf("%d\n",i+7&~0x7); return 0; }
-
Was machst du da?
i+7&~0x7
-
~0x7 ist die Invertierung des Hex/Oktalwertes 7, gedacht als Bitmaske, sieht also dann so aus 1111...11000.
Durch das & werden die letzten drei Bits von i+7 genullt, was einer Rückstellung auf die letzte durch 8 teilbare Zahl gleichkommt (denn der Restanteil +1...+7 wird damit weggefiltert). Im Zusammenhang mit dem von allen verwendeten +7 (um über jene nächste Grenze zu hüpfen), ergibt es genau den erwünschten Effekt. Lässt sich auf alle Potenzen von 2 anwenden - streng genommen nur im unsigned-Bereich, aber wir hatten Kontrollstrukturen ja ausgeschlossen
Mit den günstigen Operatorhierarchien ging es ohne Klammern in diesem Fall, sieht hübsch aus und erschreckt NewbiesIch gehe sogar davon aus, dass Eure Aufgabensteller mit dieser Frage diejenigen finden wollte, die schon ein richtiges Gefühl für die Bits entwickelt haben, dann ist es nämlich diese Lösung. Sicherlich sind die Modulo-Dinge richtig und angebracht - aber für den Fall 8 (oder eben anderer Zweierpotenzen) gibt es noch diese spezielle Lösung.
Ich kann sogar noch eine auf dieser Basis anbieten:#include <stdio.h> int main() { int i; scanf("%d",&i); printf("%d\n", ((i+7)>>3)<<3); return 0; }
hier ersetzt der Shift die Division und Multiplikation mit 8.
-
Sehr interessant was du da mit den Bits anstellst.
Wie kommst du darauf dass du zuerst invertieren, dann die letzen drei bits auf null stellen musst... Wie weißt du wann du was anwenden mußt? Und was bringen dir diese bitoperationen? Ich glaube nicht dass dir das ne Menge Geschwindigket spart. Und was würde es noch für Bitoperationen geben
-
...das kommt mit der Zeit.
Schau Dir mal einfach sämtliche Operatoren an.
Es spart Zeit, wenn Du wirklich rechenintensive Sachen machst.
Es kann aber durchaus sein, dass ein sehr gut optimierender Compiler Dinge wie *8 sowieso in <<3 umsetzt.
-
Dazu braucht es keinen sehr gut optimierenden Compiler, diese Optimierung ist trivial Das können Compiler schon lange.
-
besser gesagt solche Bitoperationen braucht es gar nicht?
-
Doch, aber nicht *8 zu ersetzen.
-
alles klar dankeschön:)
-
fubar schrieb:
int x = (Zahl+7) - (Zahl+7)%8; //oder int x = ((Zahl+7)/8)*8;
Berechnen beide das nächstgrößere Vielfache von 8 (das war doch das Problem, oder sehe ich das falsch?)
ich glaube die formel funzt nicht wenn Zahl = 0 ist...
-
stimmt ja.
Wenn wir gerade mal dabei sind. was bedeutet IrgendeineZahl & 0x7fff wäre sicher ne frage für bitsy
-
SpaceMonkey schrieb:
stimmt ja.
Wenn wir gerade mal dabei sind. was bedeutet IrgendeineZahl & 0x7fff wäre sicher ne frage für bitsy
bitmaske
-
bitmaske? ah ja eh klar!!!!
-
dies hier funzt auch mit einer 0-eingabe:
#include <stdio.h> #define GESUCHTE_ZAHL 8 int main (void){ int i ; scanf ("%d",&i) ; printf ("%d\n", i|0x0?((i+GESUCHTE_ZAHL-1)>>3)<<3:GESUCHTE_ZAHL) ; return 0 ; }