2013-07-28 22 views
1

我正在编写一个处理基因序列的程序,我想将每个核苷酸存储在一个字节中,其中每个位代表基因字母表中的一个字母A,C,G,T(只有一半这些位将被明显地使用)。用typedef和enum代表C中的DNA字母

我的编码如下:

A = 0b1000 
C = 0b0100 
G = 0b0010 
T = 0b0001 
R = 0b1010 
Y = 0b0101 
N = 0b0000 

这里,R是嘌呤,它可以代表AGY是嘧啶(CT)和N可以站在中任一字母。

什么是使用typedefenum在C中定义这种格式的最佳方式?我想定义一个类型,让我的名字,例如指定了一封信给一个变量

typedef ... nucleotide_t; 
nucleotide_t x[] = {G, A, T, T, A, C, A}; 

编辑:感谢您的输入。我绝对有我的理由不想字符串,但谢谢你的建议。确实,逻辑上,N应该是0b1111,但对于我的应用程序来说,将其表示为以上都不是

请注意,我有一个想法如何使这项工作,但我不会打破醇过于频繁,我宁可寻找最优雅的解决方案是什么。我想如果我想保留NUL字节,那么我可以在我的代码处添加0b10000

我认为两种可行的方法是enum或一些#define宏。然而,枚举是int,我需要一个char,所以宏是更好的解决方案?

+0

也许你可以使用像'的#define A(0b1000)'或'的#define A(0x8中)'。分享并享受。 –

+1

+1为标题 - 让我想起19世纪英国旅行的旧时代,例如“用火炮和蝴蝶网穿越非洲”。 –

+1

除非这种编码大大提高了性能,否则我只会使用ASCII字符。这样你可以使用'strstr'和类似的函数来处理以空字符结尾的字符串。如果确实需要位模式具有特殊含义,则至少应避免使用值0,这样您仍然可以在序列中使用字符串函数。 –

回答

-1

如何做这种方式:

typedef enum NUC{ 
    N   = 0, 
    T   = 1, 
    G   = 2, 
    C   = 4, 
    Y   = 5, 
    A   = 8, 
    R   = 10 
}nucleotide_t; 
+0

那么为什么不直接忽略它们呢? –

+0

这将创建一个'int',而不是'char'。 – oceanhug