【问题标题】:Can someone explain the practical usage and implementation of masking bits?有人可以解释屏蔽位的实际用法和实现吗?
【发布时间】:2015-02-23 21:38:54
【问题描述】:

我正在努力准备技术面试,我注意到一些练习题涉及位掩码和位移位。我对这些概念不熟悉。我了解,如果您使用半字节并希望保留另一半可用,则可以屏蔽要使用的 4 位,但我仍然对如何轻松理解或应用于编码问题感到相当困惑。如果有人有足够的知识或一些资源可以用非常简单的术语(最好是 Java)来解释这一点,我将不胜感激。谢谢!

【问题讨论】:

  • 对于可能应用它们的编码问题的具体现实示例(通常是非 Java),IP 网络术语“网络掩码”被称为它并非偶然。跨度>

标签: java binary bit-manipulation bit masking


【解决方案1】:

如果您有一组布尔标志,并且您想要一个紧凑的表示形式,或者如果您希望能够有效地测试真/假模式的某些组合,那么位掩码是一种有效的工具。

例如假设如下(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) ) {
    /*...*/
}

【讨论】:

    【解决方案2】:

    这里有一些例子:

    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了。

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2013-07-29
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多