Christoph Zurnieden: n-ten Tag des Jahres

Beitrag lesen

Hi,

var isLeap      = (Year % 400 == 0 || (Year % 4 == 0 && Year % 100 != 0));
Normalerweise erledige ich sowas naemlich teilweise per Bit-Juggling und das waere ein wenig hart fuer Anfaenger.

Wie würde das dann ausschauen?

Damit koenntest Du als Anfaenger eh nichts anfangen. Du bist kein Anfaenger? Na, dann weist Du ja selbst wie's geht.

-;>

Aber Scherz beiseite und der Reihe nach durch das Dingen.
Das einfachste ist hier wohl das Modulo 4, denn 4 = 2^2, d.h. ein Rightshift tut hier seinen Teil (ist bei Javascript ein klein wenig umstaendlicher alles, aber das soll hier nicht stoeren.) zusammen mit einem Leftshift und einem XOR. Bei so einer kleinen Zahl geht auch AND; hier waere es also: Year&3.
Zudem darf das Jahr nicht durch 100 teilbar sein, das ist schon etwas komplizierter. Nein, eigentlich nicht, das laesst sich alles mit Shifts und Additionen erledigen, hier mal eine kleine Uebersicht (gemeinerweise als Multiplikation ;-) und in C-Syntax:

  
result =   number << 1;                 // number * 2  
result =  (number << 1) + number;       // number * 3  
result =  (number << 2) + number;       // number * 5  
[...]  
result = ((number << 2) + number) << 1; // number * 10  
[...]  

(Ja, ich weiss auch das 10 keine Primzahl ist ;-)

Was fehlt noch? Ah ja, die 400, mit der kann man natuerlich nach gleichem Muster verfahren. Das fuehrt dann zu (MOD stehe hier fuer die oben beschriebene Fummelei):

  
isLeap = (((Year & 3) ^ (Year MOD 100) ^ (Year MOD 400)) == 0);  

Das ist aber natuerlich immer noch die gleiche Formel, nur wurde die teure direkte Division entfernt, das ist schlichte und daher total bloedsinnige Microoptimierung, wenn in Javascript implementiert. (Anders natuerlich wenn Du direkt auf oder sogar in der Hardware arbeiten musst)

Da ist die Frage nur natuerlich, ob sich das nicht vereinfachen laesst. Kleiner Tip: XOR ist im Grunde Modulo 2 auf Bitebene. Na, bekommst Du die Moduloregeln noch zusammen? Gut, bei Wikipedia schmuhen ist hier durchaus mal erlaubt ;-)

so short

Christoph Zurnieden

0 46

n-ten Tag des Jahres

Andreas
  • javascript
  1. 0
    Hopsel
  2. 0
    Axel Richter
    1. 0
      Andreas
      1. 0
        Vinzenz Mai
        1. 0
          Axel Richter
          1. 0
            MudGuard
          2. 0
            Ingo Turski
            1. 0
              MudGuard
              1. 0
                Ingo Turski
                1. 0
                  Der Martin
                  1. 0
                    Vinzenz Mai
                  2. 0
                    Ingo Turski
                2. 0
                  MudGuard
  3. 0
    Thomas Meinike
    1. 1
      Christoph Zurnieden
      1. 0
        Thomas Meinike
        1. 0
          Christoph Zurnieden
          1. 0
            Cheatah
            1. 0
              Christoph Zurnieden
      2. 0
        MudGuard
        1. 0
          Christoph Zurnieden
      3. 0
        Gunnar Bittersmann
        1. 0
          Christoph Zurnieden
          1. 0
            Gunnar Bittersmann
            1. 0
              Der Martin
          2. 0
            Fabian St.
            1. 1
              Christoph Zurnieden
              1. 0
                Fabian St.
                1. 0
                  Christoph Zurnieden
                  1. 0
                    Christian Kruse
                    1. 0
                      Christoph Zurnieden
                      1. 0
                        Christian Kruse
                  2. 0
                    Fabian St.
                    1. 0
                      Christoph Zurnieden
  4. 0
    Gunnar Bittersmann
    1. 0
      Der Martin
      1. 1
        Gunnar Bittersmann
        1. 0
          Thomas Meinike
          1. 0
            Gunnar Bittersmann
            1. 0
              Thomas Meinike
          2. 0
            Swen Wacker
            1. 0
              MudGuard
            2. 0
              Thomas Meinike
            3. 0
              Gunnar Bittersmann
        2. 0
          Christian Kruse