[英]merge binary strings and convert to decimal in c
下面的代码将从用户那里获得两个整数X
和Y
,将它们转换为二进制并将Y
的所有位插入到X
中最后一个设置位之后。
示例: 10 14
output: 188
解释:
10 -> 1010
14 -> 1110
10111100 -> 188
这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int insertBits(int X, int Y) {
int int_to_bin(int k) {
return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_bin(k / 2)));
}
int a1 = int_to_bin(X);
int a2 = int_to_bin(Y);
char msg[20];
char msg1[20];
char deal[20];
sprintf(msg, "%d", a1);
sprintf(msg1, "%d", a2);
int k = 0;
int i = 0;
for (i = strlen(msg) - 1; i >= 0; i--) {
if (msg[i] == '1') {
k = 1;
break;
}
}
memcpy(msg, &msg[0], i);
memcpy(deal, &msg[i], -1);
strcat(msg, deal);
printf("%s", strcat(deal, msg1));
}
int main() {
insertBits(10, 20);
}
我编写代码直到将输入转换为二进制并提取二进制我不知道如何合并它并转换为十进制。请帮助我
好的,让我们总结一下您必须做的事情,
此函数将单个数字转换为 4 位二进制字符串。 调用 2 次,你会得到两个带有 4 位 bin 编号的字符串。 现在获取两个字符串并将其连接起来以获得最终字符串。
const char *byte_to_binary(int x)
{
static char b[9];
b[0] = '\0';
int z;
for (z = 8; z > 0; z >>= 1)
{
strcat(b, ((x & z) == z) ? "1" : "0");
}
return b;
}
现在,如果您需要更多 4 位怎么办。 你可以看到我已经初始化了z=8
因为 0b0000 1000 在 dec 中是 8。所以如果你需要 5bit 那么z=16
因为 0b0001 0000 在 dec 中是 16。
要将数字字符串转换为十进制,请使用基本概念。 如果 bin 编号为 0b1000,则要将其转换为 dec,您需要执行 1 2^3 + 0 2^2 + 0 2^1 + 0 2^0。
for(sum=0, j=0, s=strlen(num)-1; s >= 0; s--, ++j){
if(num[s] == '1'){
sum = sum + pow(2,j);
}
}
此代码片段在 dec 中转换二进制字符串。 就是这样。
PS 没有给你完整的代码,因为时间有限,我猜你很聪明,可以自己弄清楚。 评论任何帮助。
我会给出一个不可移植的答案。 它适用于 x86 + gcc。
#include <stdio.h>
int insertBits(int X, int Y) {
int msb;
asm("bsrl %1,%0" : "=r"(msb) : "r"(X));
Y <<= (msb+1);
return X|Y;
}
int main() {
printf("%d\n", insertBits(10, 20));
}
X=10 => 1010
Y=20 => 10100
结果=330 => 101001010
您的方法受到严重限制:如果数字大于 1023,转换将溢出int
的范围。
您应该使用unsigned int
arguments,计算X
中尾随零的数量和Y
中的位数,结果很容易通过移位操作获得:
unsigned int insertBits(unsigned int X, unsigned int Y) {
int n1, n2;
unsigned int temp;
if (X == 0)
return Y;
if (Y == 0)
return X;
// compute the number of trailing zeroes in X
for (n1 = 0, temp = X; (temp & 1) == 0; n1++, temp >>= 1)
continue;
// compute the number of bits in Y
for (n2 = 0, temp = Y; temp != 0; n2++, temp >>= 1)
continue;
return ((X >> n1 << n2) | Y) << n1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.