Android源碼中的位運算

在看Android源碼的時候經常可以看到 |=、&、~這樣的符號,對於科班的人來說一般都會認識這些符號啦,就是位運算符嘛,但是現在對於非科班的就會有點蒙圈了,因爲我們在學習的時候經常用的是&&、|| 這樣的,但是它們變成單個去用的卻幾乎沒遇到過,其實這種也是理解起來也是很簡單的,因爲這些符號就是將我們的常用運算轉化成爲二進制來進行運算的,目的就是爲了加快運算速率,因爲我們現在用的計算機系統使用的基本上都是二進制系統。

簡單的瞭解一下位運算符

& 位與,運算過程就是先將我們的十進制數轉換成二進制,然後進行同位“與”比較,如果相同位上的都是1,那麼得出的結果這個位上就是1,否則這個位上就是0

| 位或,當然也是十進制先轉換成二進制,然後進行同位“或”比較,如果相同位上的有一個是1,那麼就是1,其餘情況就是0

^ 異或,十進制轉二進制~然後同位“異或”比較,如果相同位上的值相同,結果爲0,不相同爲1

~ 按位取反,十進制轉成二進制,不過這個有點特殊,不能當作運算符來使用,只能對某個值進行按位取反操作,也就是同位1變成0,0變成1;使用這個去反過後,我們就能夠得到這個數的相反數-1,因爲我們使用的計算機是以補碼存數據,正數補碼是本身,負數補碼是取反加1。

下面說一下我在查看源碼中遇到的一些二進制運算。

舉個栗子:

聲明兩個變量:

private int mFlag;
private int FLAG_1 = 2;

最常見的就是:(mFlag |= FLAG_1), 代表爲mFlag添加FLAG_1屬性,換算成十進制和mFlag+=FLAG_1得到的結果是一樣的

經常會看到這種判斷:(mFlag & FLAG_1)!= 0 ,代表如果已經將FLAG_1 通過這樣 “|=” 賦給 mFlag,則 mFlag & FLAG_1 = mFlag,否則 mFlag & FLAG_1 = 0

還有這種運算:mFlag &= ~FLAG_1 ,代表如果已經將 FLAG_1 |= 賦給 mFlag,則減去FLAG_1,如果沒有則mFlag的值不變

說白了,其實二進制也沒有那麼難嘛,短除法大家應該都會,只不過可能我們不能心算二進制罷了,多來幾張紙就行了:)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章