我正在努力准备技术访谈,我注意到一些练习问题涉及比特屏蔽和比特转换。我不熟悉这些概念。据我所知,如果你使用一半的字节并希望让另一半可用,你可以屏蔽你想要使用的4位,但我仍然对如何容易理解或应用于编码问题感到困惑。如果某人有足够的知识或某些资源以非常简单的术语(最好是用Java)解释这一点,我将非常感激。谢谢!
答案 0 :(得分:0)
如果你有一组布尔标志,你需要一个简洁的表示,或者如果你想能够有效地测试某些真/假模式的组合,那么Bitmasks是一个有效的工具。
例如假设以下(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) ) {
/*...*/
}
答案 1 :(得分: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。