Nächste Vielfache von 8 ohne Kontrollstruktur berechnen?



  • 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 Newbies 🙂

    Ich 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 ;
    }
    


  • das i|0x0 was immer es auch macht braucht es gar nicht:

    printf ("\n%d\n", i?((i+GESUCHTE_ZAHL-1)>>3)<<3:GESUCHTE_ZAHL);
    könnte mir jemand mal ein paar bitoperatoren wie >> << | & erklären?

    Danke im voraus.



  • SpaceMonkey schrieb:

    das i|0x0 was immer es auch macht braucht es gar nicht

    du brauchst es um die 0-eingabe zu berechnen. sonst ist bei einer 0-eingabe die ausgabe = 0.



  • SpaceMonkey schrieb:

    könnte mir jemand mal ein paar bitoperatoren wie >> << | & erklären?

    bsp. sagen wir du hast eine zahl: dezimal 27 = 00011011 binär.
    mit den >> operatoren verschiebst du die bits nach rechts, und mit << nach links. Also:
    00011011 >> 3 = 00000011

    genauso andersrum:

    unsere zahl 27 = 00011011
    00011011 << 3 = 11011000

    verstanden?



  • ja das >> << hab ich verstanden da gibts aber noch das & |.
    i|0x0 braucht es meiner Meinung nach immer noch nicht. egal was für eine zahl eingegeben wird i|0x0 ist die eingegebene zahl. eingabe=0 -> i|0x0=0 bei eingabe 0 ist die ausgabe nicht null da ja GESUCHTE_ZAHL 8 ist.

    Hoffe hab alles schon richtig verstanden


Anmelden zum Antworten