Преобразование значения Longint в бинарную строку

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

Здраствуйте.

Пишу функцию для Arduino IDE преобразование значения Longint в бинарную строку, вот она

/ ================================================= }
// Преобразование значения Longint в бинарную строку }
// Digits кол-во знаков в строке                     }
// Важно!  незначащие нули сохраняются               }
// Пример: 32,9 ='000100000' [9]                     }
//         64,9 ='001000000' [9]                     }
//         128,9='010000000' [9]                     }
//         511,9='111111111' [9]                     }
//===================================================}

String InttoStrBin1(long Value, int Digits) {
  
  String Result;
     Result = "";
  for (int a = Digits ; a > 0 ; a-- ) {
    if (Value & (1 << a) != 0 ) { 
      Result = Result + '1'; 
    }
    else
    {  
      Result = Result + '0'; 
    }
  }
  return Result;
}

Эта функция в задумке формирует строку определенной длины. Но она не работает. Не могу найти в чем ошибка?

 

 

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

И как она "не работает"?

rkit
Онлайн
Зарегистрирован: 23.11.2016

SyrBrandon пишет:

    if (Value & (1 << a) != 0 ) { 

Скобки правильно расставь

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Расставьте нормально скобки в строке №16 или вообще выбросьте "!= 0" - оно там не нужно. Тогда заработает, но криво - будет съедать нулевой бит, т.к. Вы его почему-то решили не преобразовывать (a никогда у Вас нулю не равно). Если исправите и это, получит то, что хотели.

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

Не работает так:
511,9 = 111111111 ( верно)
128,9 = 000000000
64,9 = 000000000

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кстати, ответьте. мне чисто психологически интересно. Про эти скобки Вам ведь компилятор, наверняка, говорил. Почему игнорируете? На самом деле все новички так - предупреждения компилятора - побоку, плевать на них. Почему?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SyrBrandon пишет:
Не работает так: 511,9 = 111111111 ( верно) 128,9 = 000000000 64,9 = 000000000

Если не работает, выкладывайте скетч. Откуда нам знать, что Вы там наменяли и как именно она у Вас "так" не работает?

Только убедитесь, что Вы прочитали вторую часть моего поста!

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

Serial.print(a, BIN) не проще?

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

b707 пишет:

Serial.print(a, BIN) не проще?


Мне нужна эта переменная в дальнейшем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Serial.print(a, BIN) не проще?

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

SyrBrandon, так что, скетч будет или расходимся?

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

ЕвгенийП пишет:

SyrBrandon пишет:
Не работает так: 511,9 = 111111111 ( верно) 128,9 = 000000000 64,9 = 000000000

Если не работает, выкладывайте скетч. Откуда нам знать, что Вы там наменяли и как именно она у Вас "так" не работает?

Только убедитесь, что Вы прочитали вторую часть моего поста!


Спасибо за Ваш совет, я его еще не попробовал

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

А вот ещё на пробу: Digits раз проверяем (Value & 0x01), после каждой проверки сдвигаем Value на один бит вправо. 

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

ЕвгенийП пишет:

Кстати, ответьте. мне чисто психологически интересно. Про эти скобки Вам ведь компилятор, наверняка, говорил. Почему игнорируете? На самом деле все новички так - предупреждения компилятора - побоку, плевать на них. Почему?


На счет предупреждения компилятора сейчас посмотрел внизу пишет только это:
Размер скетча в двоичном коде: 5406 байт (из 30720 байт максимум)

Или это где то еще можно посмотреть, у меня Arduino ide 1.0.5

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SyrBrandon пишет:
На счет предупреждения компилятора сейчас посмотрел внизу пишет только это: Размер скетча в двоичном коде: 5406 байт (из 30720 байт максимум) Или это где то еще можно посмотреть, у меня Arduino ide 1.0.5

Насчёт "1.0.5" не знаю (и где Вы такую древность взяли?), но в современных версиях, разработчики по умолчанию выключают вывод предупреждений (не знаю зачем), его надо включать - иначе как слепой. Включить можно "Файл|Настройки" а там напротив слов "Сообщения компилятора" выбрать "Все". Это обязательно надо делать - он много полезного говорит.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SyrBrandon][quote=ЕвгенийП пишет:

у меня Arduino ide 1.0.5

И машина времени в гараже? Если что, то сегодня 11 марта 2020года. Не благодари.

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

ЕвгенийП пишет:

Расставьте нормально скобки в строке №16 или вообще выбросьте "!= 0" - оно там не нужно. Тогда заработает, но криво - будет съедать нулевой бит, т.к. Вы его почему-то решили не преобразовывать (a никогда у Вас нулю не равно). Если исправите и это, получит то, что хотели.

Благодарю за совет Все заработало как надо.
Проблема была в скобках и переменная "a" не достигала 0.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Но предупреждения включите по-любому. Это полезно.

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

ЕвгенийП пишет:

SyrBrandon пишет:
На счет предупреждения компилятора сейчас посмотрел внизу пишет только это: Размер скетча в двоичном коде: 5406 байт (из 30720 байт максимум) Или это где то еще можно посмотреть, у меня Arduino ide 1.0.5

Насчёт "1.0.5" не знаю (и где Вы такую древность взяли?), но в современных версиях, разработчики по умолчанию выключают вывод предупреждений (не знаю зачем), его надо включать - иначе как слепой. Включить можно "Файл|Настройки" а там напротив слов "Сообщения компилятора" выбрать "Все". Это обязательно надо делать - он много полезного говорит.

Похоже в этой версии нет такого пункта, тут есть Показывать подробный вывод при компиляции, галочку взвел, повалились сообщения

SyrBrandon
Offline
Зарегистрирован: 18.04.2014

ЕвгенийП пишет:

Но предупреждения включите по-любому. Это полезно.


Благодарю. Действительно там много всего интересного. И про скобки нашел упоминание.