Fabian St.: n-ten Tag des Jahres

Beitrag lesen

Hi Christoph!

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.

-;>

Naja, die Frage ist wohl eher, was du als »Anfänger« definierst. Aber ich gebe ja zu, auf dem Gebiet der verschiedenen Bit-Operationen (Shifting, etc.) kenne ich mich (noch) kaum aus und sehe bisher noch nicht wirklich einen Sinn darin, was ich aber zu ändern gedenke. Genau aus diesem Grunde frage ich hier auch nach.

In der letzten Zeit versuche ich zum Beispiel die verschiedenen Hash-Algorithmen zu verstehen und diese selber zu implementieren. Dabei wird ja beinahe ausschließlich mit den einzelnen Bits gearbeitet, aber insbesondere das Verständnis »warum so, und nichts anders« bereitet mir im Moment noch einige Probleme.

Right- und Leftshift habe ich mittlerweile glaube ich verstanden: Ein Rightshift um n Bits ist ja nichts anderes als eine Division durch 2^n, weil die einzelnen Bits nach Rechts verschoben werden. Ein Leftshift ist dementsprechend eine Multiplikation mit 2^n. Was bringt mir das nun aber genau, d.h. wann schreibe ich

  
int result, i  
i = 8  
result = i << 2 // result ist nun 32  

und wann

  
int result, i  
i = 8  
result = 8 * pow(2, 2)  

Es ist letzten Endes nur für die Geschwindigkeit der Operation zum Vorteil (auch wenn diese Beispiel wohl hierfür unglücklich gewählt sind) oder gibt es noch weitere Gründe, bei der man das Beispiel bevorzugen würde?

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.

Das »Year & 3« entspricht wohl dem »Year % 4«, wobei sich die 3 aus folgenden Überlegungen herleitet:

[latex]
3_{(10)} = 1 * 2 + 1 * 1 = 11_{(2)}
[/latex]

Eine Zahl im Dualsystem ist genau dann durch 4 teilbar, wenn die letzten zwei Ziffern eine Null sind. Insofern sollte bei »Year % 3« immer 0 herauskommen weil eine »&«-Verknüpfung der Bits dann z.B. so aussieht:

[latex]
1101_{(2)} & 0011_{(2)} = 0001_{(2)} \not= 0 \rightarrow 1101_{(2)} = 13_{(10)} ist nicht durch 4 teilbar
[/latex]

Sind meine Gedankengänge soweit richtig?

Ab hier steige ich dann aus, kannst du das nachfolgende bitte nochmal genauer (ohne eventuelle Spielereien, die das ganze »feiner«, aber auch schwieriger machen) erklären? D.h. was bezweckst du mit untenstehenden Bit-Shifting?

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 ;-)  
  
  
Grüße,  
Fabian St.

-- 
Selfcode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%28+ss%3A%29+de%3A%3E+js%3A%7C+ch%3A%3F+mo%3A%29+zu%3A%29)
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