2011-09-24 20 views
5

Estoy en el medio de crear un juego pequeño basado en consola para nuestra asignación de clase de programación C y decidí hacerlo más presentable y único agregando colores de texto y fondos de texto.¿Qué significa esta expresión? (Función SetConsoleTextAttribute en C)

Mientras yo estaba en mi búsqueda de la búsqueda de una solución, he encontrado esta práctica función que hará de la manera que quería para mi proyecto, pero el problema es que no es esta parte que no entiendo:

WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F); 

Donde, BackC y ForgC se dan enteros y el tipo de datos WORD es solo un typedef para unsigned short int. Específicamente, lo que no entiendo es la parte ((BackC & 0x0F) << 4) + (ForgC & 0x0F). Puede alguien ayudarme con esto? Sé que puedo usar la función, pero realmente quiero saber cómo funciona la función ... ¡Gracias!

Aquí está el código fuente completo (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 –

Respuesta

4

ForgC y BackC son dos valores que se pueden expandir en realidad sólo para tomar de 4 bits cada una (se puede decir esto porque están siendo bitwise ANDed con 0x0F, que borra todos menos los últimos 4 bits del primer operando).

Así que si nos fijamos en ellos como valores de ancho de 8 bits, que serían de la forma

ForgC  0000xxxx 
BackC  0000yyyy 

Entonces desplazamiento en modo bit ForgC 4 bits a la izquierda, por lo que

ForgC  xxxx0000 
BackC  0000yyyy 

Y luego los agrega juntos¹, haciendo

ForgC  xxxx0000 
BackC  0000yyyy 
Result  xxxxyyyy 

Entonces, ¿qué hace esto en efecto es "combinar" bot h valores en uno. SetConsoleTextAttribute podría separarlos de nuevo, o podría usar el valor combinado tal como está.


¹ Técnicamente esto debería ser un bitwise OR en lugar de la adición de número entero. Aunque en este caso específico (donde se garantiza que los dos operandos no tienen un bit de 1 en la misma posición), ambas operaciones producirán el mismo resultado, lo que hace que el intento sea más claro.

+0

Muchas gracias @Jon! Esto es absolutamente lo que quiero saber. Nunca supe que podría usar binarios literales en un programa en C ... Si tiene tiempo, sería genial si pone la versión "bitwise OR" aquí ... Gracias de nuevo :) – Raven

+0

@Raven: No hay nada que es solo '((BackC & 0x0F) << 4) | (ForgC y 0x0F) '(' | 'en lugar de' + '). – Jon

0

Si toma los 4 bits más bajos de cada BackC y ForgC y se une a ellos para obtener un valor de 8 bits.

((
    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. si BackC es 0b......abcd y ForgC es 0b.....efgh (ambos en representación binaria) obtendrá el valor 0xabcdefgh.

+0

Gracias hombre. Esta es técnicamente la misma respuesta que la anterior, pero elijo la otra por su respuesta elaborada ... De todos modos, aprecio tu ayuda :) – Raven