protobuf 中的奇怪表达式:if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {

strange expression in protobuf : if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {

在使用 protoc 从 .proto 文件 (google protobuf) 生成的 faster-rcnn c++ 代码中,我看到了这一行但无法理解。 caffe-fast-rcnn/.build_release/src/caffe/proto/caffe.pb.cc

void NetParameter::MergeFrom(const NetParameter& from) {
  GOOGLE_CHECK_NE(&from, this);
  input_.MergeFrom(from.input_);
  input_shape_.MergeFrom(from.input_shape_);
  input_dim_.MergeFrom(from.input_dim_);
  layer_.MergeFrom(from.layer_);
  layers_.MergeFrom(from.layers_);
  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    if (from.has_name()) {
      set_name(from.name());
    }
    if (from.has_force_backward()) {
      set_force_backward(from.force_backward());
    }
    if (from.has_state()) {
      mutable_state()->::caffe::NetState::MergeFrom(from.state());
    }
    if (from.has_debug_info()) {
      set_debug_info(from.debug_info());
    }
  }
  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
}

它用于合并(覆盖奇异值并添加到数组)从 'from' 到 'to' 的网络参数。我这里的问题是这个表达式:

if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) 

为什么使用 0/32 作为索引,它只是 0?以及为什么使用 0 % 32,它也是 0?

代码生成器经常创建这样的代码。在您的情况下,表达式 0%32 和 0/32 的结果都是 0。由于预处理器都 calculated/simplified,因此它们不消耗运行时间。