2011-09-24 18 views
5

Sono nel bel mezzo della creazione di un piccolo gioco basato su console per il nostro compito di programmazione in classe C e ho deciso di renderlo più presentabile e unico aggiungendo colori di testo e sfondi testo.Cosa significa questa espressione? (Funzione SetConsoleTextAttribute in C)

Mentre ero sulla mia ricerca alla ricerca di una soluzione, ho trovato questa comoda funzione che farà solo il modo che volevo per il mio progetto, ma il problema è che c'è questa parte che non capisco:

Dove, BackC e ForgC hanno numeri interi e il tipo di dati WORD è solo un typedef per un int breve senza segno. Nello specifico, ciò che non capisco è la parte ((BackC & 0x0F) << 4) + (ForgC & 0x0F). Qualcuno mi può aiutare con questo? So che posso semplicemente usare la funzione ma voglio davvero sapere come funziona la funzione ... Grazie!

Ecco il codice sorgente (colorExample.c)

#include <windows.h> 
#include <stdio.h> 
void SetColorAndBackground(int ForgC, int BackC); 
int main() 
{ 
    SetColorAndBackground(10,1); //color value range 0 up-to 256 
    printf("what is text background color \n"); 
    SetColorAndBackground(11,1); 
    printf("how about this?"); 
    getch(); 
    return 0; 
} 
void SetColorAndBackground(int ForgC, int BackC) 
{ 
    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F); 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); 
    return; 
} 
+0

http://en.wikipedia.org/wiki/Bitwise_operation –

risposta

4

ForgC e BackC sono due valori che possono davvero solo espandersi a prendere da 4 bit ciascuna (si può dire questo perché stanno essendo bitwise ANDed con 0x0F, che cancella tutti, ma gli ultimi 4 bit del primo operando).

Quindi, se li guardiamo come valori di larghezza 8 bit, sarebbero della forma

ForgC  0000xxxx 
BackC  0000yyyy 

Poi spostamento bit a bit ForgC 4 bit a sinistra, rendendo

ForgC  xxxx0000 
BackC  0000yyyy 

E poi li aggiungete¹, rendendo

ForgC  xxxx0000 
BackC  0000yyyy 
Result  xxxxyyyy 

Quindi, in effetti, ciò che è "combine" bot h valori in uno. SetConsoleTextAttribute potrebbe quindi separarli nuovamente oppure potrebbe utilizzare il valore combinato così com'è.


¹ Tecnicamente questo dovrebbe essere un bitwise OR invece di addizione intero. Anche se in questo caso specifico (dove i due operandi sono garantiti per non avere un 1 bit nella stessa posizione) entrambe le operazioni produrranno lo stesso risultato, OR a bit rende più chiara l'intento.

+0

Grazie mille @Jon! Questo è assolutamente ciò che voglio sapere. Non ho mai saputo che potrei usare i binari letterali in un programma in C ... Se hai tempo, sarebbe bello se mettessi qui la versione "bitwise OR" .... Grazie ancora :) – Raven

+0

@Raven: Non c'è niente da esso, è solo '((BackC & 0x0F) << 4) | (ForgC & 0x0F) '(' | 'invece di' + '). – Jon

0

Se prende i 4 bit inferiori di ciascuna BackC e ForgC e li unisce per ottenere un valore a 8 bit.

((
    BackC & 0x0F  // take last 4 bits of BackC 
) << 4)    // and shift 4 to the left 
+ 
(
    ForgC & 0x0F  // plus take last 4 bits of ForgC 
) 

E.g. se BackC è 0b......abcd e ForgC è 0b.....efgh (entrambi in rappresentazione binaria) riceverai il valore 0xabcdefgh.

+0

Grazie amico. Questa è tecnicamente la stessa risposta di quella sopra, ma scelgo l'altra per la sua risposta elaborata ... Ad ogni modo, apprezzo il tuo aiuto :) – Raven

Problemi correlati