2013-03-04 89 views
0

有人可以請我解釋,如果有的話,這段代碼,它做什麼,爲什麼?具體地說底線...請求的解釋

protected uint uMask; 
int nBits = (int)Math.Log(BlockSize, 2); 
uMask = 0xffffffff << nBits; 

例如,在第一次迭代BLOCKSIZE爲8,是NBITS 3和操作之後,umask是4294967288.

我試圖谷歌搜索第三行,因爲我不知道如何把它變成通俗易懂的語言,並且我得到了代碼示例,這不是我一直在尋找的。

+6

'<<'是一個位移轉換aka' * 2^nBits' – 2013-03-04 15:56:42

+0

@ratchetfreak是正確的。您可以在左邊的方向上將0xffffffff 2^n Bytes中的位移入。 – mrtnrdl 2013-03-04 15:58:46

+1

看看二進制或十六進制的所有數字,它會比基數10更有意義。 – Servy 2013-03-04 16:12:18

回答

1

這看起來是要創建一個掩碼來排除較大結構中的位。某些數據可能存儲在一個較大的值中,並具有最大值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 

除非你有學者數學能力,你永遠將能夠讀取十進制掩碼。