繁体   English   中英

二进制转换器不适用于大量

[英]Binary Converter Not Working for Large Numbers

我正在编写从整数转换为二进制表示形式,反转二进制然后再转换回整数的C代码。 它运行良好,但我需要它用于输入值最大为10 ^ 9的情况。 目前看来,大于10 ^ 7的值似乎会中断。 我的意思是我输入了一个数字(例如10000000)并得出17967657062982931584作为二进制表示形式(尽管对于较小的整数是准确的)。 另外,我不确定int_to_binary是唯一遇到此问题的函数,或者不确定是否也需要针对大输入优化其他函数。 有什么想法我要去哪里吗? 谢谢。

#include <stdio.h>
#include <string.h>

unsigned long long int_to_binary(unsigned long long k) {
    if (k == 0) return 0;
    if (k == 1) return 1;
    return (k % 2) + 10 * int_to_binary(k/2);
}

unsigned long long reverse_int(unsigned long long l) {
        unsigned long long reversed; 
    reversed = 0;
        while (l > 0) {
                reversed = reversed * 10 + (l%10);
                l = l / 10;
        }
        return reversed;
}

unsigned long long binary_to_int(unsigned long long k) {
    char binaryString[80];
    snprintf(binaryString, 4, "%llu", k);
    unsigned long long decimal = 0;
    int length = strlen(binaryString);
    int i = 0;
    while(i < length) {
        decimal = (decimal << 1) + (binaryString[i] - 0x30);
        i++;
    }
    return decimal;
}

int main() {
    int number;
    printf("Enter a number: ");
    scanf("%d", &number);
    printf("You entered %d\n", number);
    unsigned long long b = int_to_binary(number);
    printf("In Binary, this is %llu\n", b);
    unsigned long long c = reverse_int(b);
    printf("When we reverse it, it looks like this: %llu\n", c);
    unsigned long long d = binary_to_int(c);
    printf("And when we convert that back to an int, it looks like this: %llu\n", d);
        return 0;
}

您使用long long将二进制数表示为十进制。 在许多架构上,这导致最大值被存储为2 ** 64-1 = 18446744073709551615。

如果输入十进制数(例如10000000),则不能将其表示为64位的十进制二进制数。

问题是试图将二进制数作为10的幂的和。 直接操作二进制代码效率更高。 只需在reverse_int函数中将10更改为2

unsigned long long reverse_int(unsigned long long l) {
        unsigned long long reversed; 
        reversed = 0;
        while (l > 0) {
                reversed = reversed * 2 + (l%2);
                l = l / 2;
        }
        return reversed;
}

为了以二进制形式打印数字,编写一个循环,使用模%或按位运算符(如&>>依次测试每个位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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