我正在尝试将一个16位长的字符数组1和0拆分为2个等长的整数,以便将8位二进制转换为十进制。
示例:char* str =“0001011011110000”预期结果:
int s = 00010110;
int t = 11110000;
完整代码:它做什么:用户输入一串DNA(例如:ATTCGG)。如果字符串不能被4整除,它将使用strcat()填充额外的字符。然后,它将每个字符转换为新字符数组xtr[64]中的一个两位字符串。然后,必须将该数组转换为两个等长的8位二进制整数,以便转换为表示DNA字符串的两个十进制数。基本上,DNA二进制压缩就是赋值。
int main()
{
char str[64];
scanf("%s", str);
int obe = strlen(str);
int mod = obe % 4;
if (mod != 0) {
for (int i = mod; i > 0; i--) {
strcat(str, "0");
}
}
int j;
char xtr[64] = "";
for (j = 0; j < strlen(str); j++) {
if (str[j] == 'A') {
strcat(xtr, "0");
strcat(xtr, "0");
} else if (str[j] == 'T') {
strcat(xtr, "0");
strcat(xtr, "1");
} else if (str[j] == 'C') {
strcat(xtr, "1");
strcat(xtr, "0");
} else if (str[j] == 'G') {
strcat(xtr, "1");
strcat(xtr, "1");
} else if (str[j] == '0') {
strcat(xtr, "0");
strcat(xtr, "0");
}
}
int k = strlen(xtr) / 2;
char ret[64];
for (int i = 0; i < k; i++) {
ret[i] = xtr[i];
}
char ter[64];
for (int i = k + 1; i < strlen(xtr); i++) {
ter[i] = xtr[i];
}
int s = atoi(ret);
int t = atoi(ter);
printf("%s", str);
printf("\n");
printf("%s", xtr);
printf("\n");
printf("%d", s);
printf("\n");
printf("%d", t);
}
结果:附件TCGG00 000101101110000 10110 0
问题:第二个整数没有被正确转换,并且这个代码非常原始。可能需要位运算符。
2条答案
按热度按时间wfveoks01#
vsmadaxz2#
下面是代码的修改版本,其中包含注解:
将DNA序列转换为中间字符串是不必要的。
幸运的是,字母"A"、"C"、"G"和"T"的ASCII代码在第1位和第2位编码得足够好。这个"编码"与你的不同,分配不同的位模式来代表每个碱基。
缺点是传统的"ACGT"交换了最后两个碱基的顺序。
此"交换"可以通过使用精心编制的8位十六进制值的转换"取消交换"。
浏览以下代码并学习下面的演示字符串:
输出演示:
玩一会儿这个。
这是核心处理的另一个版本,它同时将4个碱基的批次转换为1和0的字符串,并显示十进制等价物。