Нужен самый быстрый способ преобразовать 2-е дополнение в десятичное в C - PullRequest
1 голос
/ 22 апреля 2010

У меня есть определенные 18 бит (которые являются дополнением 2) в пределах 32 бит.Мне нужно преобразовать их в десятичные.Пожалуйста, покажите мне фрагмент кода в C.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 22 апреля 2010

Сначала вам нужно сделать расширение знака на ваших 18 битах, чтобы заполнить нативное int:

const int negative = (smallInt & (1 << 17)) != 0;
int nativeInt;

if (negative)
  nativeInt = smallInt | ~((1 << 18) - 1);
else
  nativeInt = smallInt;

Если число считается отрицательным (т. Е. Установлен бит 17), мы побитуем - или это с битовой комбинацией, которая имеет единицы во всех оставшихся битах. Это создает правильное отрицательное целое число нативного размера.

Затем просто выведите собственное целое число как обычно, поскольку вы говорите так, как будто вам нужно десятичное строковое представление:

char buf[12];

snprintf(buf, sizeof buf, "%d", nativeInt);

Конечно, эта последняя часть может не соответствовать вашим ожиданиям; это не возможно "самый быстрый". Поскольку у вас ограниченный входной диапазон 18 бит, возможно, можно придумать что-то более оптимизированное.

Несколько идей:

  1. Удалите аргумент размера буфера (т.е. используйте sprintf()), так как мы можем быть совершенно уверены в максимальном количестве необходимых символов.
  2. Поскольку мы знаем диапазон, используйте что-то менее общее, которое никогда не проверяет значения вне диапазона.
  3. Используйте itoa(), если оно у вас есть, менее общее, чем s*printf(), поэтому может быть быстрее.
0 голосов
/ 08 декабря 2015

Я попробовал это сам и прекрасно работает:

int binTwosComplementToSignedDecimal(char binary[],int significantBits) 
{
    int power = pow(2,significantBits-1);
    int sum = 0;
    int i;

    for (i=0; i<significantBits; ++i)
    {
        if ( i==0 && binary[i]!='0')
        {
            sum = power * -1;
        }
        else 
        {
            sum += (binary[i]-'0')*power;//The -0 is needed
        }
        power /= 2;
    }

    return sum;
}

Образец:

char binary[8] = '10000001';
int significantBits = 8;
int decimal = binTwosComplementToSignedDecimal(binary,significantBits);

Результаты в

decimal = -127
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...