code: func (f Flags) String() string {
  	// If 0x01 is unset, no assumptions can be made about 0x02, 0x08, 0x20, 0x40 and 0x80
  	const pairedMask = ProperPair | MateUnmapped | MateReverse | MateReverse | Read1 | Read2
  	if f&1 == 0 {
  		f &^= pairedMask
  	}
  
  	const flags = "pPuUrR12sfdS"
  
  	b := make([]byte, len(flags))
  	for i, c := range flags {
  		if f&(1<<uint(i)) != 0 {
  			b[i] = byte(c)
  		} else {
  			b[i] = '-'
  		}
  	}
  
  	return string(b)
  }
docs: // String representation of BAM alignment flags:
  //  0x001 - p - Paired
  //  0x002 - P - ProperPair
  //  0x004 - u - Unmapped
  //  0x008 - U - MateUnmapped
  //  0x010 - r - Reverse
  //  0x020 - R - MateReverse
  //  0x040 - 1 - Read1
  //  0x080 - 2 - Read2
  //  0x100 - s - Secondary
  //  0x200 - f - QCFail
  //  0x400 - d - Duplicate
  //  0x800 - S - Supplementary
  //
  // Note that flag bits are represented high order to the right.