Нужна функция для преобразования массива 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;
}
но это не работает?
С уважением и благодарностью Ник
@Nic, 👍0
Обсуждение1 ответ
Лучший ответ:
Предполагая, что логические значения с прямым порядком байтов (сначала наименее значащие логические значения), вы должны использовать простой битовый сдвиг, а не вычисление мощности с плавающей запятой:
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
- Как преобразовать строку в массив байтов
- Проблемы с преобразованием byte[] в String
- Как преобразовать строку в длинную?
- Как преобразовать время EPOCH во время и дату на Arduino?
- Преобразование строки в IP-адрес
- Подключите Arduino Uno RX/TX к GPS-модулю 3,3 В NEO-M8N.
- Преобразование 16 бит в число с плавающей запятой
- Как преобразовать char[12] в byte[6]
«Не работает» — плохое описание проблемы. Объясните, что он на самом деле делает и чего вы от него ожидали. Предоставьте минимальный, но полный тестовый скетч, показывающий проблему, @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