Help Побитовые операции

Asiv
Offline
Зарегистрирован: 22.04.2014

Нахожусь на начальном этапе освоения IDE Arduino/

растолкуйте кто может пару строк в скетче касательно побитовой посылки  12 бит данных в ЦАП.

 

for(int i=11; i>=0; i--)        / /send the 12 bit sample data
                                                    ЗДЕСЬ ПОНЯТНО-  i принимет значение от 11 до 0
{
digitalWrite(DATA, (value & (1 << i) ) >> i );   //DATA ready
                                                          Эту стоку не могу понять в упор
 
.
.
.}
Может кто знает источник где можно потренироваться с подобными примерами, хитро закрученными выражениями.
Radjah
Offline
Зарегистрирован: 06.08.2014

Еще 100500 одинаковых тем создай.

<< и >> - это побитовое смешение или умножение/деление на 2.

Asiv
Offline
Зарегистрирован: 22.04.2014

Уважаемый Radjah,

Первый раз на Вашем форуме и движок форума несколько необычный. Поэтому темы создались не по моему злому умыслу.Пока разбрался как создавать они создались. Удалить к сожалению нет возможности. Потому прошу модератора удалить мусор.

Что касается Вашего ответа то к сожалению не понял. Если не затруднит то более подробно. Я знаю что >> это оператор смещения  содержтимого байта в лево  или вправо и соответственно умножение/деление. Мне не понятно сама структура строки.

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

for(int i=11; i>=0; i--){ 
  if(value & (1 << i)) digitalWrite(DATA, 1);
  else digitalWrite(DATA, 0);
}

 

sva1509
Offline
Зарегистрирован: 07.12.2012

все очень просто 

digitalWrite - записывает бит в 0 или 1, но именно бит. У вас задача установить 1-ну ногу контроллера поочередно во все состояния бит в числе А (допусти 5). Для этого вы должны выделить поочередно все биты числа А (А & 1; A & 2; A & 4; A & 8 и т.д.), для этого вы сдвигаете в лево 1 (на 0 это 1; на 1 это 2; на 2 это 4 и т.д.). И так бит выделен допустим второй, но результат 4, а вам в digitalWrite нужно записат 0 или 1. Для этого результат операции & нужно сдвинуть в право на столько же бит на сколько 1 мы сдвигали в лево 4 >> 2 даст 1, которую вы и установите digitalWrite.

Datak
Offline
Зарегистрирован: 09.10.2014

А потому что понапишут примеров - действительно фиг пойми что...
Проще же надо, проще.

for( int i = 11; i >= 0; i-- )
{ 
  digitalWrite( DATA, ( value >> i ) & 1 );
}

Только насчёт "value нигде не определена" - это что, правда? Это я не знаю, это надо попробовать самому скомпилить. Определена где-нибудь, конечно, надо только найти где.

std
Offline
Зарегистрирован: 05.01.2012

Пользуясь темой спрошу, сохраняется ли последняя оставшаяся единица при сдвиге?

Например:

0b10000000<<1 будет равно 0b00000001 или 0b00000000?

то же самое и в другую сторону - 0b00000001>>0 - ноль или 0b10000000?

Если ноль, т. о. не сохраняется, то включается ли это? Где и как?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

насколько помню пропадает. но точно не скажу