2012-03-04 91 views
2

這裏是我在C程序中看到的代碼,我知道這段代碼是在對應於字符c的位ASCII位圖中設置一個位。c語言按位技巧

field[ (c & 0x7f) >> 3 ] |= 1 << (c & 0x07); 

字段是一個16個字符的數組,每個字符是8位。

例如「97」是下殼體「A」,如果我們設置℃至97,則bit位置97將被設置爲1。

任何一個知道爲什麼上面的代碼將設置位圖對應於字符c? 什麼是那些神奇的數字0x7f,0x07,3和1?

回答

6

如果你的數組長16個字節,它有128位(16×8)。所以第一個掩碼(0x7f)保證你只對前128個字符感興趣。一旦你將它右移3位,你就剩下4位用於尋址你的位域(數字((c & 0x7F)>> 3是一個介於0和15之間的數字),所以這部分使用高4位地址字節

現在,您需要對字節中的位進行尋址,因此您使用掩碼0x07將值限制在範圍0 - 7(對應於位0到7)。轉移1個如此多的位置。

最後,你有一個位的位置設定在0到127(16個字節8位)。我希望這有助於!

1

首先要清理幻數

0x7f0111 1111二進制。這意味着c的低7位很重要。然後將其移位3,以便只有原始的0xxx x000(4)位是重要的。但是,由於這些位被移位3,所以它們計數0到15.

0x070000 0111二進制。這意味着只有低3位是重要的。數字1左移這3位的值,導致在字節內的位位置0到7中設置一位。

最後,函數只使用字節中的低7位,這是ASCII字符中唯一有效的位。它使用高位4來尋址數組中的字節,最低3使用尋址字節中的位來尋址。