C:将DNA序列压缩成二进制

  • 本文关键字:压缩 二进制 DNA c bin
  • 更新时间 :
  • 英文 :


Hi-im试图找出如何获得将DNA代码转换为二进制位的函数,需要使其看起来像这样:ACGTT->XXXXXX 11 11100100从右到左对于A=0 C=1 G=2 T=3。现在我想按字符来做,然后把它移动>>2,但我搞不清函数本身。。。我试过这样做,结果它返回NULL。

char CompressChar(char c){
char temp[8]="XXXXXXXX";
if (c=='A'){
temp[7] = '0';
temp[6] = '0';
}
if (c=='C'){
temp[7]='1';
temp[6]='0';
}
if(c=='G'){
temp[7]='0';
temp[6]='1';
}
if(c=='T'){
temp[7]='1';
temp[6]='1';
}
return temp;

}

我认为你希望每个字母(它们被称为核苷酸iirc?(代表2个二进制数字。

首先,char temp[8]="XXXXXXXX";没有意义,因为C中的字符串是以null结尾的,并且您没有为null终止符分配空间,应该是[8+1]。你想要16位,而不是8位。

您的函数返回一个char,这是不正确的,您需要返回一个完整的数组。这必须通过参数来完成,因为你不能在C中返回数组。你不能返回指向本地数据的指针,所以最好把分配留给调用者。无论如何抓取该函数。

此外,将其转换为"二进制字符串"并没有多大意义。最好将其转换为二进制数字,然后根据需要将该数字转换为字符串。

转换,包括"向后顺序",然后可以这样做:

uint16_t dna_to_bin (const char* str)
{
uint16_t result = 0;
size_t i;
for(i=0; i<16; i+=2)       // loop over bits in the resulting binary number
{
typedef enum             // local enum just for readability
{
A = 0,
C = 1,
G = 2,
T = 3,
} dna_t;
dna_t type=0;            // default is 0 if nothing to decode
if(*str != '')         // keep decoding string until reaching the end
{
switch(*str)
{
case 'A':     type = A; break;
case 'C':     type = C; break;
case 'G':     type = G; break;
case 'T':     type = T; break;
}
str++;
}
result |= (uint16_t)type << i; // store data at correct position in the result
}
return result;
}

完整示例,包括一个打印二进制并丢弃下面前导零的函数。如果您想用X替换前导零,那么修改应该很简单。

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdbool.h>
uint16_t dna_to_bin (const char* str)
{
uint16_t result = 0;
size_t i;
for(i=0; i<16; i+=2)
{
typedef enum
{
A = 0,
C = 1,
G = 2,
T = 3,
} dna_t;
dna_t type=0;
if(*str != '')
{
switch(*str)
{
case 'A':     type = A; break;
case 'C':     type = C; break;
case 'G':     type = G; break;
case 'T':     type = T; break;
}
str++;
}
result |= (uint16_t)type << i;
}
return result;
}

void print_bin (uint16_t bin)
{
bool remove_zeroes = true;
for(size_t i=0; i<16; i++)
{
uint16_t mask = 1u << (16-1-i);
uint16_t bit = bin & mask;
if(bit == 0)
{
if(!remove_zeroes)
{
printf("0");
}
}
else
{
remove_zeroes = false;
printf("1");
}
}
}

int main (void)
{
const char STR_DNA[] = "ACGTT";
uint16_t bin = dna_to_bin(STR_DNA);
puts(STR_DNA);
printf("Hex: %.4"PRIX16 "n", bin);
printf("Bin: ");
print_bin(bin);
return (0);
}

输出:

ACGTT
Hex: 03E4
Bin: 1111100100

最新更新