2015-02-23 81 views
-1

我正在準備技術性採訪,我注意到一些涉及位掩碼和位移的練習題。我不熟悉這些概念。我明白,如果你使用半個字節並想讓另一半可用,你可以屏蔽你想使用的4位,但我仍然很困惑它如何容易理解或應用於編碼問題。如果某人有足夠的知識或某種資源以非常簡單的方式解釋這一點(最好用Java),我將不勝感激。謝謝!有人可以解釋屏蔽位的實際使用和實現嗎?

+1

對於一個具體的,現實的例子(不支持Java,通常情況下),編碼問題,他們可能會被應用的,並非偶然的是,IP網絡術語「子網掩碼」被稱爲是。 – 2015-02-23 23:06:13

回答

0

位掩碼是一個有效的工具,如果你有布爾標誌,你會喜歡它的簡潔表示,或者如果你希望能夠有效地測試的真/假模式的某些組合的集合。

例如,假設下面的(C++,因爲我的Java是相當生鏽):

enum { 
    FlagOne = (1<<0), 
    FlagTwo = (1<<1), 
    FlagThree = (1<<2), 
    FlagFour = (1<<4), 

    FlagOneAndFour = FlagOne | FlagFour 
}; 

unsigned int flags; 

你現在可以做一個非常簡潔的方式各種測試。例如,要測試是否任何FlagOne,FlagTwo或FlagFour的設置,你可以寫

if(0 != (flags & (FlagOne | FlagTwo | FlatFour))) { 
    /*...*/ 
} 

或者,如果你想測試FlagOneAndFour被設置,你可以做

if(FlagOneAndFour = (flags & FlagOneAndFour)) { 
    /*...*/ 
} 
0

下面是一些例子:

int a = 60; /* 60 = 0011 1100 */ 
int b = 13; /* 13 = 0000 1101 */ 
int c = 0; 

c = a & b; /* 12 = 0000 1100 */ 
System.out.println("a & b = " + c); // a & b = 12 

c = a | b; /* 61 = 0011 1101 */ 
System.out.println("a | b = " + c); // a | b = 61 

c = a^b; /* 49 = 0011 0001 */ 
System.out.println("a^b = " + c); // a^b = 49 

c = ~a;/*-61 = 1100 0011 */ 
System.out.println("~a = " + c); // ~a = -61 

c = a << 2; /* 240 = 1111 0000 */ 
System.out.println("a << 2 = " + c); // a << 2 = 240 

c = a >> 2; /* 215 = 1111 */ 
System.out.println("a >> 2 = " + c); // a >> 2 = 15 

c = a >>> 2; /* 215 = 0000 1111 */ 
System.out.println("a >>> 2 = " + c); // a >>> 2 = 15 

但是已經有一個很好的全面的SO question on bit operations in Java

相關問題