2011-09-24 69 views
5

Tôi đang ở giữa việc tạo một game dựa trên giao diện điều khiển nhỏ cho bài tập lớp lập trình C của chúng tôi và tôi quyết định làm cho nó trở nên dễ đọc và độc đáo hơn bằng cách thêm màu văn bản và hình nền.Biểu thức này có ý nghĩa gì? (Hàm SetConsoleTextAttribute trong C)

Trong khi tôi đã vào cuộc tìm kiếm của tôi tìm kiếm một giải pháp, tôi đã tìm thấy chức năng này tiện dụng mà sẽ làm chỉ là cách tôi muốn cho dự án của tôi nhưng vấn đề là có phần này tôi không hiểu:

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

Ở đâu, BackCForgC được cung cấp các số nguyên và kiểu dữ liệu WORD chỉ là typedef cho một ký tự ngắn chưa được ký. Cụ thể, điều tôi không hiểu là phần ((BackC & 0x0F) << 4) + (ForgC & 0x0F). Bất cứ ai có thể giúp tôi với điều này? Tôi biết rằng tôi chỉ có thể sử dụng chức năng nhưng tôi thực sự muốn biết cách hoạt động của chức năng ... Cảm ơn!

Đây là mã nguồn đầy đủ (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 –

Trả lời

4

ForgCBackC hai giá trị có thể thực sự chỉ mở rộng để chiếm 4 bit mỗi (bạn có thể nói điều này bởi vì họ đang được bitwise ANDed với 0x0F, mà xóa tất cả nhưng 4 bit cuối cùng của toán hạng đầu tiên).

Vì vậy, nếu chúng ta nhìn vào họ như các giá trị rộng 8-bit, họ sẽ có dạng

ForgC  0000xxxx 
BackC  0000yyyy 

Sau đó, bạn Bitwise thay đổi ForgC 4 bit sang trái, làm cho

ForgC  xxxx0000 
BackC  0000yyyy 

Và sau đó bạn thêm chúng lại với nhau¹, làm cho

ForgC  xxxx0000 
BackC  0000yyyy 
Result  xxxxyyyy 

Vì vậy, điều này có hiệu lực là "kết hợp" bot h giá trị thành một. SetConsoleTextAttribute sau đó có thể tách chúng lại hoặc có thể sử dụng giá trị được kết hợp như hiện tại.


¹ Về mặt kỹ thuật, đây phải là bitwise OR thay vì bổ sung nguyên. Mặc dù trong trường hợp cụ thể này (trong đó hai toán hạng được đảm bảo không có 1 bit ở cùng một vị trí) cả hai thao tác sẽ tạo ra cùng một kết quả, bitwise HOẶC làm cho ý định rõ ràng hơn.

+0

Cảm ơn rất nhiều @Jon! Đây hoàn toàn là điều tôi muốn biết. Tôi không bao giờ biết rằng tôi có thể sử dụng nhị phân trong một chương trình C ... Nếu bạn có thời gian, nó sẽ là tuyệt vời nếu bạn đặt phiên bản "bitwise OR" ở đây .... Cảm ơn một lần nữa :) – Raven

+0

@Raven: Không có gì để nó, nó chỉ là '((BackC & 0x0F) << 4) | (ForgC & 0x0F) '(' | 'thay vì' + '). – Jon

0

Nếu có thấp hơn 4 bit của mỗi BackCForgC và gia nhập chúng để có được một giá trị 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 
) 

Ví dụ: nếu BackC0b......abcdForgC0b.....efgh (cả hai trong biểu diễn nhị phân), bạn sẽ nhận được giá trị 0xabcdefgh.

+0

Cảm ơn người đàn ông. Đây là câu trả lời giống như câu trả lời ở trên, nhưng tôi chọn câu trả lời khác cho câu trả lời phức tạp ... Dù sao, tôi đánh giá cao sự giúp đỡ của bạn :) – Raven

Các vấn đề liên quan