位運算收集

(1<<(x&31)) & mask):
這個mask是一個32bit數, 假設是0xaaaaaaaa.
剛開始理解這個費啦不少時間,咱們能夠先折1/4來看。表達式則變成啦:
(1<<(x&(2^8-1))) & 0xaa) == (1<<(x&15)) & 0xaa):it

x&15獲得的範圍是[0,15),  能夠獲得x這個數落在15中的哪一個位置,即便大於15也仍會落在這其中的一個位置。而後1左移這個數則把這個位置置1,者表示這個數落在這個位置。擴展

而後&mask, mask 是咱們想要的行爲表現,1這是真,0則是假。
首先任意一個正數x, 能夠表達爲 :x = 16*n +[0,15]. 換句化說,任意一個數能夠以16爲一個單位對它進行mask進行行爲控制。
當前咱們的mask = 0xaa = 1010,1010, 這樣每16個數的行爲表現爲「真假真假,真假真假」。

一樣咱們擴展一下,咱們但願以32爲一個單位進行控制。那麼咱們的表達式就變成啦:
(1<<(x&31)) & mask), mask 必須是32bit數,行爲表現咱們能夠本身定義。時間

相關文章
相關標籤/搜索