A& ~(b - 1)這個表達式做了什麼?

請問這個表達式主要是用來做什麼的?背景暫時無法描述清楚(如果能夠描述清楚可能也就不用問了),所以請先看看吧。後面想辦法看看能不能補充清楚。


在通常的cpu上面,如果b是整數類型,那麼~(b-1) == ~b+1 == -b


向更小方向取整,類似floor,比如取16位元組對齊的地址:addr = ~(16-1)


對於有符號數來說~x = -x - 1,這是補碼的特性,所以
A ~(b - 1) = A (-b)
你問這個是幹了什麼?我還想知道呢……
不過我可以猜啊……
既然你寫了「IP地址」,那我只有一種猜測:

A = &
inv_mask = 32 - mask;
b = 1&<&

一般我們把一個IP地址+子網掩碼寫成192.168.100.1/24這樣的CIDR的形式,這個形式有時候也會用反掩碼錶示成192.168.100.18,這時候這個8就是反掩碼位數,也是上文中的inv_mask。首先把1左移inv_mask位,就會得到一個1後面跟了inv_mask個0的二進位數;再減去1,就是最低的inv_mask個二進位位為1,其他為0,這個數就是防火牆設置當中經常使用的反掩碼,我們知道子網掩碼經常表示為255.255.255.0這樣,那麼反掩碼同樣表示成四個十進位位元組就是0.0.0.255。顯然反掩碼再取反就是掩碼了,IP地址與子網掩碼與的結果,就是子網網段subnet。任意兩個IP地址與子網掩碼與,判斷得到的結果是否相同,就知道兩個IP是否屬於同一個網段。


一般使用在內存地址對齊4的倍數,因為此時cpu效率最高


可以用來判斷一個 數字是否 2^n
A ~(A - 1) == A


推薦閱讀:

(Python)爬蟲解析特殊驗證碼?
文科女,已在職,零基礎想學編程,求解?
自己寫的爬蟲程序運行停止,下次運行如何不重複爬取?
如何用scrapy提取不在標籤內的文字?
tcp 編程中,connect 連接成功的標準是什麼?

TAG:演算法 | 編程 | C編程語言 | IP地址 |