Как объединить биты в байт?

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

Привет

Условно, есть четыре кнопки подключенные к цифровым пинам

Считываю состояния кнопок, пишу их в булевы переменные, вывожу в порт - все ок

Но хотелось бы как то "склеить" эти четыре, по сути независимых друг от друга, бит

Пример: s3=1; s2=1; s1=0; s0=0;

Как собрать их в целый байт типа 00001100, чтобы в дальнейшем можно было работать уже с целым числом.. перевести его в нашу систему счисления (будет 12, если не ошибаюсь), провести какие-то операции с ним, вычесть, умножить и т.д.

Прошу прощения, если где-то ошибся в терминологии, меньше недели занимаюсь программированием :)

Мой код:
boolean s3, s2, s1, s0;
void setup ()
{
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  Serial.begin(9600);
}
void loop()
{
  s3=!digitalRead(2);
  s2=!digitalRead(3);
  s1=!digitalRead(4);
  s0=!digitalRead(5);

  Serial.print(s3);
  Serial.print(s2);
  Serial.print(s1);
  Serial.println(s0);
  delay(1000);  
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Структуру с битовыми полями сделай

bwn
Offline
Зарегистрирован: 25.08.2014

summ= s3*8+s2*4+s1*2+s0;

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

Спасибо за ответ!

Мне, кажется, ещё рано связываться с таким материалом

Полчаса посидел в гугле по запросу "битовые поля с++" и чуть не разревелся как школьник

Возможно сделать это другим путём? Наверняка есть какие-то простые математические операции для подобного..

Способ побитового сдвига поначалу показался мне подходящим, но не фартануло

bwn
Offline
Зарегистрирован: 25.08.2014

Вам надо еще проще, чем во #2?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kirill Iashin пишет:

Спасибо за ответ!

Мне, кажется, ещё рано связываться с таким материалом

Полчаса посидел в гугле по запросу "битовые поля с++" и чуть не разревелся как школьник

Возможно сделать это другим путём? Наверняка есть какие-то простые математические операции для подобного..

Способ побитового сдвига поначалу показался мне подходящим, но не фартануло

вам же подсказали постом выше, как можно сделать не просто, а очень просто, и никаких сдвигов

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

Спасибо, работает!

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

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

Если описать, то магия может перестать работать...

bwn
Offline
Зарегистрирован: 25.08.2014

Каждый бит умножаем на "вес его разряда" и суммируем.

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

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

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

Спасибо, добрый человек!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kirill Iashin пишет:

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

вам последовательность цифр 1-2-4-8-16-32-64-128 о чём нибудь говорит?

bwn
Offline
Зарегистрирован: 25.08.2014

Kirill Iashin пишет:

Спасибо, добрый человек!

Не на чем, вы главное про него не забудьте, когда начнете числа расчленять для вывода на индикаторы.

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

ua6em пишет:

вам последовательность цифр 1-2-4-8-16-32-64-128 о чём нибудь говорит?

Чувствую подвох, но все же отвечу, это результаты степени двойки. Например, 8=2³ и т.д

bwn
Offline
Зарегистрирован: 25.08.2014

А посикоку арихметика у МК двоичная, то каждый разряд в байте и далее, равен ее степени.

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

bwn пишет:

А посикоку арихметика у МК двоичная, то каждый разряд в байте и далее равен ее степени.

Предельно ясно, спасибо!

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

Kirill Iashin пишет:

а вы уже набросились на меня

Так ото ж! :)))

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

Kirill Iashin, а Ваш интерес точно с терроризмом не связан? А то, чего доброго :(

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

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

Kirill Iashin, а Ваш интерес точно с терроризмом не связан?

Хорошая попытка, товарищ майор :)

Обычная практика, сам создаю себе проблему и пытаюсь решить.. как видите, не усегда успешно

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

Вы мне льстите, до майора я ещё не дорос, но точно знаю, что отряд из восьми вахабитов называется вахабайтом, вот и думаю, не эти ли отряды Вы формируете?

bwn
Offline
Зарегистрирован: 25.08.2014

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

Вы мне льстите, до майора я ещё не дорос, но точно знаю, что отряд из восьми вахабитов называется вахабайтом, вот и думаю, не эти ли отряды Вы формируете?

Ох, Евгений Петрович, есаул эт вроде тысячник, сиречь, полковник. А у Вас, значица, две звездочки (бааааальших), али неправ?

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

Это вы о названии поста про биты в байт?

Понимаю, что boolean так или иначе занимает целый байт, просто так было проще описать суть проблемы 

 

Хорошего вечера! :)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Boolean можно запихнуть и в 1 бит

PS Дожили, на форумах биты и двоичную арифметику расписывать, жервы java и прочих framework ов :(

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

andycat пишет:
Boolean можно запихнуть и в 1 бит

Надеюсь, это никак не связано в битовыми полями? Мне кажется я сегодня об этом читал..

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Kirill Iashin пишет:

andycat пишет:
Boolean можно запихнуть и в 1 бит

Надеюсь, это никак не связано в битовыми полями? Мне кажется я сегодня об этом читал..

Начните с основ, как работает транзистор, какая нибудь микросхема, логические И ИЛИ и прочее, станет сразу проще.

ЗЫ. Залез в википедию почитать что такое битовые поля, никогда не знал что они так называются - при чем здесь это?

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

bwn пишет:

Ох, Евгений Петрович, есаул эт вроде тысячник, сиречь, полковник. А у Вас, значица, две звездочки (бааааальших), али неправ?

Есаул имеет чистый погон. Соответсвует примерно майору. Старше него "войсковой старшина" - погоны как у подполковника. Младше - подъесаул - погоны как у капитана ( и статус примерно такой же).

Kirill Iashin
Offline
Зарегистрирован: 28.02.2019

andycat пишет:
Начните с основ, как работает транзистор, какая нибудь микросхема, логические И ИЛИ и прочее, станет сразу проще.

Спасибо. Понемногу разбираюсь, как раз вчера изучал логические операции, в частности понравился искл ИЛИ (^), получилось преобразовать 4 битный код Грея в двоичный

В любом случае знания хоть какие-то уже есть, но их сложно применить если занимаешься этим несколько дней и толком не осознаешь как это устроено

andycat пишет:
Залез в википедию почитать что такое битовые поля, никогда не знал что они так называются - при чем здесь это?

На каком-то форуме видел, что можно сделать boolean в 1 бит, если использовать struct.. но могу ошибаться

Да и вообще, это была шутка ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

bwn пишет:

Ох, Евгений Петрович, есаул эт вроде тысячник, сиречь, полковник. А у Вас, значица, две звездочки (бааааальших), али неправ?

Есаул имеет чистый погон. Соответсвует примерно майору. Старше него "войсковой старшина" - погоны как у подполковника. Младше - подъесаул - погоны как у капитана ( и статус примерно такой же).

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

Гриша
Offline
Зарегистрирован: 27.04.2014

один из моих первых проектов - кодовый замок на 4 кнопки. Там у каждой кнопки свой вес (как в посте 2), есть время определения одновременного нажатия т.е. после нажатия любой из кнопок, запускается таймер и по его окончании считываются все кнопки. Веса нажатых кнопок суммируются и сравниваются с константой кода (массив). Запускается таймер сброса. если больше ничего не нажать переменная массива скинется, если нажать - повторяем процедуру и сравниваем со следующим элементом массива. когда переменная массива достигнет необходимой величины и сумма весов последнего нажатия будет соответствовать значению массива, я все скидываю и открываю замок - если нет, переменная дальше ростет и пишет в константу всякую муть  - защита от перебора, когда кому-то охота потыкать на кнопки и тапа брутом открыть дверь.  

UPD про флаг забыл, пока идешь по массив управильно - флаг есть, когда ошибся - флаг скинулся. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Одна из самых простых и достаточно эффективных методик защиты от перебора - логарифмически увеличивающаяся задержка при неправильных комбинациях 

Гриша
Offline
Зарегистрирован: 27.04.2014

asam пишет:

Одна из самых простых и достаточно эффективных методик защиты от перебора - логарифмически увеличивающаяся задержка при неправильных комбинациях 

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Как же он накидает, если просто не реагировать после неправильного набора. Задолбется кидать

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

ua6em пишет:
взрослый человек, а в ряженых играетесь
Не знаю во что играется Ваш приятель - садист (самого бы его нагайкой повоспитывали), а для меня ранние в 90-ые это было жизненной необходимостью. Позволяло сэкономить массу нервов, времени, да и денег.