1

私は、整数からそのバイナリ表現に変換し、バイナリを逆にしてから整数に戻す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;
}
4

2 に答える 2

1

long long2進数を10進数として表現するために使用しています。多くのアーキテクチャでは、2**64-1 = 18446744073709551615 という最大値が格納されます。

10000000 などの 10 進数を入力すると、64 ビットの 10 進数または 2 進数として表すことができません。

于 2013-01-31T06:09:47.077 に答える
-2

問題は、10の累乗の合計として2進数を操作しようとしていることです。バイナリを直接操作する方が効率的です。関数内でに変更10するだけです。2reverse_int

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;
}

数値を2進数で出力するには、との%ようなモジュロ演算子またはビット演算子を使用して、各ビットを順番にテストするループを記述します。&>>

于 2013-01-31T07:47:23.057 に答える