u010089114 2015-09-17 08:53 采纳率: 75%
浏览 1456
已采纳

关于按位与在这个程序的的实际意义,看我注释

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);
      }  

}

  • 写回答

2条回答 默认 最新

  • threenewbee 2015-09-17 10:36
    关注

    (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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 9月11日

悬赏问题

  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线