李恒的 16 位二进制位运算神技:SAM/BAM 格式与 Bitwise FLAG 的极简哲学
2009 年 6月8日 · SAM/BAM 比对格式文件、`samtools view` 过滤命令、SAM Flag 状态速查表
你知道吗?
李恒用 16 个 bit 封印了高通量测序的万千状态,也顺便把‘心算二进制分解’变成了生信面试官最后的尊严。
如果你打开一个几个 G 大小的二代测序比对文件(.sam),每一行由制表符隔开的字段里,最神秘莫测的莫过于第二列那个看似毫无规律的十进制整数——FLAG(标志位)。为什么是 83?为什么是 163?这个精巧到令人击节赞叹的字段,来自华人生物信息学者李恒(Heng Li)等人在 2009 年 6 月 8 日《Bioinformatics》在线发表的工业级规范 SAM/BAM 格式与 SAMtools 软件集。
二代测序双端测序(PE)中,一条读段有多达 12 种极其繁复的几何状态:是否成对测序、配对是否有效、自己是否比对上、另一端是否未比对、比对在正链还是反链、是否是第一条读段还是第二条、是否是 PCR 扩增重复冗余、是否质控失败……李恒摈弃了冗长的英文字符串判断,直接动用了计算机底层最廉价、运行最快的 16 位二进制位掩码(Bitwise Mask)!
每一位(bit)对应一种状态:0x1 (1), 0x2 (2), 0x4 (4), 0x8 (8), 0x10 (16), 0x20 (32)... 记录时一个按位或(OR)直接把所有状态打包成一个数字;过滤时一个单时钟周期的按位与(AND,如 samtools view -f 2 -F 1024)毫秒级过滤几十亿条 reads,至今统治着全球高通量测序分析工作流。