這看起來是要創建一個掩碼來排除較大結構中的位。某些數據可能存儲在一個較大的值中,並具有最大值Blocksize
。該代碼確定該項目需要多少位,其最大值爲Blocksize
。然後它使用這個位數來創建一個掩碼。最後一行後,uMask
看起來二進制像這樣(假設Blocksize
是8和nBits
是3:
1111111111111111111111111111111111111111111111111111111111111000
或十六進制:
0xfffffffc
這通常被用來移除一個場。存儲在數據片以分離一些其它字段在概念上,你可能已經使用的比特爲值A和值B在一個64位的值:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBB
假設你想要得到的價值爲A.你可以做這樣的事情:
result = value & uMask; // Step 1: Mask off B
result = result >> nBits // Step 2:Align A
的數據將是這樣的:
Step 1: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA000
Step 2: 000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
除非你有學者數學能力,你永遠將能夠讀取十進制掩碼。
'<<'是一個位移轉換aka' * 2^nBits' – 2013-03-04 15:56:42
@ratchetfreak是正確的。您可以在左邊的方向上將0xffffffff 2^n Bytes中的位移入。 – mrtnrdl 2013-03-04 15:58:46
看看二進制或十六進制的所有數字,它會比基數10更有意義。 – Servy 2013-03-04 16:12:18