Помогите разобраться с функцией String(x,BIN)

Asha11981
Offline
Зарегистрирован: 26.01.2020

Нужно перевести десятичное число в двоичное. Как это сделать с помощью функции String(x,BIN)?

 
void setup() {
  Serial.begin(9600);
}
void loop() {
 
  Serial.println(5,BIN);
  String myStr = String(5, BIN); 
 
  Serial.println(myStr);
  delay(300);
}
 
Например, Serial.println(5,BIN) дает результат 101, что есть правильно, а String myStr = String(5, BIN) выдает 100. Serial.println(14,BIN) выдает 1101, что верно, а String myStr = String(14, BIN) выдает 1111. Что я делаю не так. 
 
Вообще, задача вот в чем. Приходит целое число, которое нужно перевести в двоичное, и в зависимости, от каждого разряда включать или выключать светодиод. Например, пришло 10, в двоичной 1010. 1 светодиод не горит, 2 горит, 3 не горит, 4 горит. 
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Подключены светодиоды как?

Asha11981
Offline
Зарегистрирован: 26.01.2020

К цифровым выводам, на каждый вывод 1 светодиод. Возможно, не уловил суть вопроса.

b707
Offline
Зарегистрирован: 26.05.2017

Asha11981 пишет:

Нужно перевести десятичное число в двоичное. Как это сделать с помощью функции String(x,BIN)?

Никак. Функция String() для этого КАТЕГОРИЧЕСКИ не подходит, поскольку, в соответствии с названием, превращает свой аргумент в строку (string), а не в число

 
 
Цитата:
Вообще, задача вот в чем. Приходит целое число, которое нужно перевести в двоичное, и в зависимости, от каждого разряда включать или выключать светодиод. Например, пришло 10, в двоичной 1010. 1 светодиод не горит, 2 горит, 3 не горит, 4 горит. 
 

да-да, я понял задачу. String вам не поможет.

Для вашей задачи десятичное число вообще не надо никуда преобразовывать, потому что с точки зрения компьютера двоичное 1010 и десятичное - 10 - это одно и то же.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Asha11981
Offline
Зарегистрирован: 26.01.2020

Я хотел из строки выводить каждую цифру по отдельности с помощью charAt() и дальше сравнивать с 1 или 0, и в соответствии с полученным ответом подключать или отключать светодиод. А все таки, почему функция String(x,BIN) не работает в том варианте, в котором я написал, почему не переводит в двоичную систему правильно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Лучше почитайте про битовые операции, чем над проблемами String голову ломать.

sadman41
Offline
Зарегистрирован: 19.10.2016
b707
Offline
Зарегистрирован: 26.05.2017

Asha11981 пишет:

 А все таки, почему функция String(x,BIN) не работает в том варианте, в котором я написал, почему не переводит в двоичную систему правильно?

попробовал ваш код из первого поста - у меня все работает, исправно печатается "101" в обоих случаях, так что ищите у себя ошибки.

rkit
Offline
Зарегистрирован: 23.11.2016

(x & (1 << n)) > 0

n - разряд от 0 до размерности числа - 1. Например для типа uint8_t  n будет от 0 до 7.

Asha11981
Offline
Зарегистрирован: 26.01.2020

Попробовал в Arduino IDE, действительно, работает. А не получалось реализовать с помощью сервиса Tinkercad. Штука прикольная, но результаты неожиданные. В любом случае, всем спасибо за помощь, Вам, b707, в частности. Удачи.