Mittwoch, 28. September 2011

Byte invertieren - Viele Wege führen zum Ziel / invert a byte - There's more than one way to skin a cat

Wenn wir den Wert eines Bytes invertieren wollen/sollen, dann gibt es wie immer mehrere Vorgehensweisen, dies zu tun.

Wer keine Ahnung davon hat, wie Bits und Bytes ticken, der greift u.U. zur simpelsten (pfui) Lösung:

FUNCTION ByteInverter1
LPARAMETERS vValue as Integer
    RETURN 255 - vValue
ENDFUNC 


Wer zu denen gehört, die das duale/binäre Zahlensystem beherrschen werden evtl. dazu neigen, jedes Bit einzeln zu bearbeiten.
FUNCTION ByteInverter2
LPARAMETERS vValue as Integer
    LOCAL liReturn as Integer , liLoop as Integer
    FOR liLoop = 0 TO 7
        vValue    = IIF( ;
                        BITTEST(  vValue , liLoop ) , ;
                        BITCLEAR( vValue , liLoop ) , ;
                        BITSET(   vValue , liLoop ) ;
                     )
    ENDFOR 
    RETURN vValue
ENDFUNC 

Mit Hilfe der Funktionen BITTEST (zum auslesen des Bits), BITCLEAR (zum löschen des Bits) und BITSET (zum setzen des Bits), stellt dies auch kein wirkliches Problem dar. Natürlich vorausgesetzt wir denken daran, das Bits bei Position 0 beginnen... ;-)

Dumm ist nur, das die 'simpel'-Lösung um ein vielfaches kompakter ist... ;-)

Gott sei Dank gibt es eine VFP Funktion die das ebenfalls in einem 'professionelleren' Design als 1-Zeiler ermöglicht :-)

FUNCTION ByteInverter3
LPARAMETERS vValue as Integer
    RETURN BITNOT( vValue ) + 256
ENDFOR 

Wie gesagt: Es führen viele Wege zum Ziel...:-)