Нужна функция для преобразования массива bool в int - почему это не работает?

Привет, я написал эту функцию для преобразования массива bool в int: (включая уроки математики):

bool b_array[5];

int convertToInt(start_index,stop_index){
    int run=0;
    int result=0;
    for(int id=start_index;id<=stop_index;id++){
        result+=b_array[id] * pow(2.0,run);
        run++;
    }
    return result;
} 

но это не работает?

С уважением и благодарностью Ник

, 👍0

Обсуждение

«Не работает» — плохое описание проблемы. Объясните, что он на самом деле делает и чего вы от него ожидали. Предоставьте минимальный, но полный тестовый скетч, показывающий проблему, @chrisl

Кажется, вы хотите преобразовать массив логических значений в соответствующее целочисленное значение, например, { false, true, true, false} в 0b0110 = 6? Тогда вам следует использовать лучшее приведение типов, например (int)b_array[id] и (int)pow(2.0,run). Хотя это странный способ сделать это, так как битовый сдвиг был бы более подходящим (result += b_array[id] ? (1 << run) : 0) . Также помните о числовых ограничениях вашего 16-битного подписанного int., @Maximilian Gerhardt

Функция pow возвращает число с плавающей запятой. Поплавки по своей сути неточны. Индекс массива должен быть int. Когда вы делаете степени 2 с pow, вы на самом деле не получаете 4. Вы получаете что-то 3,9999999. Поэтому, когда это усекается, оно превращается в 3, а не в 4, которые вы хотите. Используйте сдвиг битов для целых степеней 2, и у вас не будет этой проблемы., @Delta_G

Большое спасибо, ребята! Это сработало как волшебство, но без вас я бы не справился!, @Nic


1 ответ


Лучший ответ:

2

Предполагая, что логические значения с прямым порядком байтов (сначала наименее значащие логические значения), вы должны использовать простой битовый сдвиг, а не вычисление мощности с плавающей запятой:

for(int id=start_index;id<=stop_index;id++){
    result |= b_array[id] ? (1 << run) : 0;
    run++;
}

Операция тройная (b_array[id] ? (1 << run) : 0) означает:

  • Если b_array[id] равно true, то
    • Или result с 1 сдвинутым влево временем run и сохранить в result
  • иначе
    • Или result с 0 и сохранить результат (без операции).
,

Вы можете упростить это в C++, потому что логическое значение, преобразованное в целое число, равно 0 или 1. Таким образом, можно использовать (b_array[id] << run). В C нет типа данных bool, поэтому следует использовать что-то вроде ((b_array[id] !=0) << run). И мне нравится, например, result = (result<<1) | b_array[id]; больше (также может быть result = result*2 + b_array[id]), @KIIV

Спасибо за ваше решение и ваше объяснение, оно сработало с первой попытки как шарм! Спасибо большое, без вашей помощи я бы не справился!, @Nic