开发者社区> 问答> 正文

关于按位与在这个程序的的实际意义

public class VoteMsgBinCoder implements VoteMsgCoder{
public static final int MIN_WIRE_LENGTH = 4;
public static final int MAX_WIRE_LENGTH = 16;
public static final int MAGIC = 0x5400;
public static final int MAGIC_MASK = 0xfc00;
public static final int MAGIC_SHIFT = 8;
public static final int RESPONSE_FLAG = 0x0200;
public static final int INQUIRE_FLAG = 0x0100;
public VoteMsg fromWire(byte[] input) throws IOException {
ByteArrayInputStream bs = new ByteArrayInputStream(input);
DataInputStream in = new DataInputStream(bs);
int magic = in.readShort();

为什么是和MAGIC_MASK进行位与运算呢,为什么是和MAGIC进行比较呢,而不是其他数,小弟对位运算不是很明白

if ((magic & MAGIC_MASK) != MAGIC) {
throw new IOException("Bad Magic #: " +
((magic & MAGIC_MASK) >> MAGIC_SHIFT));
}
      boolean resp = ((magic & RESPONSE_FLAG) != 0);
      boolean inq = ((magic & INQUIRE_FLAG) != 0);
      int candidateID = in.readShort();
      if (candidateID < 0 || candidateID > 1000) {
      throw new IOException("Bad candidate ID: " + candidateID);
      }
      long count = 0;
      if (resp) {
      count = in.readLong();
      if (count < 0) {
      throw new IOException("Bad vote count: " + count);
      }
      }
      // Ignore any extra bytes
      return new VoteMsg(resp, inq, candidateID, count);
      }  
}

展开
收起
蛮大人123 2016-03-19 11:26:40 2029 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    (magic & MAGIC_MASK) != MAGIC)
    magic是一组二进制位开关
    MAGIC_MASK作为参照
    这里的意思就是,判断MAGIC_MASK标记为1的字段,在magic中是否全为1
    举例:

    m M m&M m&M==M
    00 01 00 0
    01 01 01 1
    10 01 00 0
    11 01 01 1
    2019-07-17 19:07:49
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载