seth: aktuelle farben des terminals eruieren

Beitrag lesen

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.