Writer :BYSocket(泥沙磚瓦漿木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket
泥瓦匠喜歡Java,文章總是扯扯Java。 I/O 基礎,就是二進制,也就是Bit。
一、Bit與二進制
什么是Bit(位)呢?位是CPU處理或者數據存儲最小的單元。類似於很小很小的開關,一開一關,表示為1或者0。所以,這就是計算機處理任何數據的“細胞”,要謹記。
而二進制,只是計算界一種規范和約定,准確的說是一種數制。念叨着“逢二進一”,這其實是一種算法。如圖
二、位運算
說完了前面兩點,泥瓦匠帶你走向位運算的概念。數在內存中以二進制存儲。位運算,也就是二進制運算,其實就是對數在內存的二進制直接操作的過程。這里有人發問了,
Q:都是1+1,位運算不見得結果不同吧。
A:這個問得好。位運算在常見的場景下是凸顯不了好處的。而在特定下,一者計算方便,速度快,支持面廣。比如我舉幾個例子,可以利用位運算判斷值的奇數偶數,還有某些特定的算法比如壓縮,加密算法嚴重依賴位算法。二者其存儲字節小,比如在文件的權限(讀,寫等)都是用位來表示的。
上面,用小對話形式和舉例一起說明了位運算。下面開始實戰。
三、操作符實戰
一、位運算與 & { 兩位全1,結果才為1 } 如圖:
作用:
① 清零。如果特定段位需要清0,則其他段與各位為0 與運算即可。0xFF & … 可以使靠右8位的其他都清0
② 取一個數中的指定位。1010 1110 & 0xF 可以獲得 1010 1110的低4位。
二、位運算或 | { 只要有個1,結果就為1 } 如圖:
作用:用於補1,哪里需要1就補哪里。
三、異或運算 ^{ 兩個響應位不同,則為1 }
作用: 特定位翻轉 1010 1110 ^ 0xF = 1010 0001
四、移位運算 左移和右移
” < <” 左移:右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當於乘2。如圖:
右移就不重復了。
這里再增加一個解決上面泥瓦匠提到的怎么判斷奇數偶數。
1
2
3
4
|
// Is it odd?
(value & 0x1) > 0
// Is it divisible by two (even)?
(value & 0x1) == 0
|
四、總結
Bit 位雖小但是基石,滴水穿石。水滴-位,值得我們好好了解。這里復雜的壓縮算法這些,以后寫到算法再說。
要點:
概念
操作符運算
Writer :BYSocket(泥沙磚瓦漿木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket