繁体   English   中英

合并二进制字符串并在 c 中转换为十进制

[英]merge binary strings and convert to decimal in c

下面的代码将从用户那里获得两个整数XY ,将它们转换为二进制并将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);
}

我编写代码直到将输入转换为二进制并提取二进制我不知道如何合并它并转换为十进制。请帮助我

好的,让我们总结一下您必须做的事情,

  1. 将数字转换为 4 位二进制并连接成字符串。
  2. 在两个数字在单独的字符串中完成后,连接两个字符串以获得新字符串。
  3. 将新字符串转换为十进制。

此函数将单个数字转换为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM