Digitale Welle

Ich hab da mal was gebastelt:

// Finde den kürzeren Weg von a nach b
// a und b sind n-bit breite Zahlen
// n = 2 .. 15
// ---------------------------------------------
// Beispiel: n = 8 ( a,b = 0..255 )
// a = 255,  b = 1: diff = +2 oder -254, also +2
// a = 10, b = 255: diff = -11 oder +245, also -11
//
int diff(unsigned int a, unsigned int b, byte n) {
   unsigned int mask = (1 << n) - 1;
   unsigned int d = (a - b) & mask;
   if (d < (mask >> 1)) return -(int)d;
   d = -1 ^ (int)mask | d; // sign extend
   return - (int)d;
}

diff (4095,1,12) sollte 2 ergeben
diff (1,4095,12) sollte -2 ergeben

Ohne Überlauf gehts natürlich auch:

diff (10,22,12) sollte 12 ergeben
diff (22,10,12) sollte -12 ergeben

Viel Spass