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