gudn tach!
hmm, muss man aber nicht explizit umwandeln. man koennte einfach von vornherein binaer rechnen:
my $fg = $default_dec & 0xf; # oder halt & 0b1111
my $bg = $default_dec>>4 & 0xf;
Naja, das binäre Rechnen (unter Perl) ist nicht so mein Ding, wenn du mir da noch auf die Sprünge helfen könntest.
das binaere rechnen laeuft syntaktisch in perl eigentlich genauso wie in c/c++.[1]
die dos-farben (fg und bg) sind in einer 8-bit-variablen gespeichert, wobei die niederwertigen 4 bits die vordergrund- und die hoeherwertigen 4 bits die hintergrundfarbe beschreiben.
genaugenommen stehen die vier bit jeweils fuer blau, gruen, rot und intensitaet, und zwar fuer fg und bg auf gleiche weise.
abcdefgh
||||||||
|||||||fg:b
||||||fg:g
|||||fg:r
||||fg:i
|||bg:b
||bg:g
|bg:r
bg:i
wenn die hintergrundfarbe schwarz ist, dann sind die hoeherwertigen 4 bits alle 0, und bei hellgrau als vordergrundfarbe sind die drei niederwertigsten bits alle 1, also
00000111 = 7
um nun die vordergrundfarben-nummer (0..15) zu bestimmen, muss man bloss die niederwertigen 4 bit betrachten
abcdefgh $default_dec
AND 00001111 & 0xf
= 0000efgh irgendwas aus 0..15
bei der hintergrundfarbe muessen nun die 4 hoeherwertigen bit betrachtet werden. wenn man allerdings wieder zahlen aus 0..15 haben moechte, muessen die 4 hoeherwertigen bit um 4 bit nach rechts verschoben werden.
abcdefgh $default_dec
0000abcd >>4
und dabei faellt mir gerade auf, dass "& 0xf" hier ueberfluessig sein sollte (sowohl bei arithmetischem als auch bei logischem shift), da von links eh mit nullen aufgefuellt werden soll. also:
= 0000abcd irgendwas aus 0..15
was jetzt uebersichtlicher ist, darueber laesst sich nur streiten.
Ach was, wer will denn zanken :)
gemeint war: s/laesst/liesse/
iow: es ist geschmackssache, aehnlich wie viele code-formatierungsfragen.
prost
seth
[1] noch. so wie es aussieht, wird das in perl6 alles anders.