Проблема преобразования двоичной строки biginteger 128 бит в массив int [4] - PullRequest
0 голосов
/ 26 марта 2019

Мой метод устанавливает бит в каждом элементе массива int.Хотя программа работает со случаем, где строка str = "11111 ... 111" (все биты равны 1), однако, в случае, если строка str = "100 ... 000" (63 нулевых числа) (первоебит равен 1, а остальные 0) проблема возникает, мой массив int {0,0,0,1} должен быть {0,0,1,0} Пожалуйста, дайте мне решение с моим кодом, если вашИдея лучше, скажите мне, чтобы я мог решить проблему в ближайшее время.

int arr[4]={0};
void convert(string str)
    {

        int length = str.length();
        for (int i = length - 1; i >= 0; i--)
        {
            if (str[i] == '1')
            {
                int pos = 3 - i / 32;
                int k;
                k = (length - i - 1) % 31;
                //if (i == 0)
                //{
                //pos = 2- length/32;
                //}
                arr[pos] = (1 << k) | arr[pos];
            }
        }
    }

Если строка имеет 1000 ... 00 (32 0 числа), массив int должен быть {0,0,1, 0} Если строка имеет 1000 ... 00 (63 0 числа), массив int должен быть {0,1,0,0}

1 Ответ

0 голосов
/ 29 марта 2019

Итак, я нашел решение для своей проблемы.Пожалуйста, помогите мне проверить мой код, а затем дайте мне знать, если какие-либо тестовые случаи делают ошибки.Спасибо.

class QInt
{
private:
    int Data[4];
public:
QInt(){

    for (int i = 0; i < 4; i++)
    {
        Data[i] = 0;
    }

}

QInt QInt::StrBinToQInt(string str)
{
    QInt temp=QInt();
    str = creString128(str);
    cout << str.length() << endl;
    cout << str << endl;
    for (int i = 127; i >= 0; i--)
    {
        int pos;
        if (str[i] == '1')
        {
            pos = i / 32;
            int k = (127-i) % 32;
            if (i % 32 == 0)
            {
                pos--;
                k = 0;
            }
            if (str[0] == '1')
            {
                pos = 0;
                k = 30;
            }
            temp.Data[pos] = (1 << k) | temp.Data[pos];
        }
    }
    return temp;
}

};

string creString(int n)
{
    string temp;
    for (int i = 0; i < n; i++)
    {
        temp += '0';
    }
    return temp;
}

string creString128(string bin)
{
    string corrBin = creString(128 - bin.length());
    corrBin += bin;
    return corrBin;
}
...