Inkrementieren/Dekrementieren

Gast #4376284
Lesenswert?
• ▲
▼
Hallo,

kann man das noch weiter verbessern?
1
    const uint16_t maxShift = 359;
2
    static int16_t shift = 0;
3
    const int16_t step = 85;
4

5
    if(step > 0)
6
    {
7
      shift = (shift + step) % maxShift+1;
8
    }
9
    else if(step < 0)
10
    {
11
      if(shift - step < 0) shift = maxShift - (shift - step);
12
      else shift = (shift - step);
13
    }
#4376300
Lesenswert?
• ▲
▼
Marion schrieb:

>       shift = (shift + step) % maxShift+1;

Da maxShift hier wohl im allgemeinen Fall keine 2-er Potenz sein wird, 
würde ich dir hier von einer % Operation abraten. Das +1 dürfte hier 
auch falsch sein, es sei denn du machst da eine Klammer drum herum
1
        shift += step;
2
        while( shift > maxShift )
3
          shift -= maxShift + 1;

das hier
1
>     }
2
>     else if(step < 0)
3
>     {
4
>       if(shift - step < 0) shift = maxShift - (shift - step);
5
>       else shift = (shift - step);
6
>     }

ist mir ehrlich gesagt zu gekünstelt. Da du sowieso mit Vorzeichen 
rechnest:
1
       shift += step;
2
       while( shift < 0 )
3
         shift += maxShift + 1;

Ob da jetzt jeweils eine Korrektur um +1 sein muss oder nicht, hängt 
davon ab, ob der Wert maxShift auch erlaubt ist oder nicht. Ich würde 
allerdings hier nicht in den Berechnungen immer +1 rechnen, sondern den 
Wert maxShift an sich um 1 höher halten. Lässt sich ja einfach beim 
Setzen bzw. Auslesen des Wertes berücksichtigen. Der Grund ist simpel: 
den Wert verändern wird man wohl eher selten, jedoch häufiger anwenden. 
Dann spar ich dem µC beim Anwenden das ständige +1 dazurechnen, während 
es beim Verändern als Operation unter "ferner liefen" fungiert.
#4376311
Lesenswert?
• ▲
▼
% bindet stärker als + (und da helfen Leerzeichen auch nicht, der 
Compiler will Klammern sehen).

Und auch bei negativem step wäre eine Addition richtig.

Viel einfacher so:
1
shift += step;
2
if (shift < 0)
3
  shift += maxShift+1;
4
else if (shift > maxShift)
5
  shift -= maxShift+1;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren