Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: terrarus, ivan_fd  
Форум Picbasic.ru » Программирование МК » Mikrobasic » Как понять код?
Как понять код?
vladh Дата: Пт, 19.07.2019, 10:07  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Уважаемые, подскажите. В одном из прилагаемых к программе примеров есть такой код:
  while TRUE

    for counter = 0 to 7

      LATA = LATA or 1 << counter

      LATB = LATB or 1 << counter

      LATC = LATC or 1 << counter

      LATD = LATD or 1 << counter

      LATE = LATE or 1 << counter

      Wait()

    next counter

    counter = 0

    while (counter < 8)

      LATA = LATA and not(1 << counter)

      LATB = LATB and not(1 << counter)

      LATC = LATC and not(1 << counter)

      LATD = LATD and not(1 << counter)

      LATE = LATE and not(1 << counter)

      wait()

      Inc(counter)

    wend

  wend
На мой взгляд он написан в стиле СИ. И из за этого этот язык мною трудно понимаем.
Так вот объясните пожалуйста бестолковому, что означает строка
 LATA = LATA or 1 << counter

и строка 
LATA = LATA and not(1 << counter) ?
Я, например, читаю первую строку как состояние регистра не меняется ИЛИ произвести сдвиг значение этого регистра влево на 1!?
ЯНДЕКС Дата: 19.07.2019
kits Дата: Пт, 19.07.2019, 11:10  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

Цитата vladh ()
Так вот объясните пожалуйста бестолковому, что означает строка LATA = LATA or 1 << counter
Сдвиг 1 влево на число в переменной counter, а после побитовое ИЛИ LATA. Производится установка бита указанного в переменой counter. То есть если в ней был 0, установится 0 бит, если 2, установится 2 бит.

Цитата vladh ()
и строка LATA = LATA and not(1 << counter) ?
Аналогично предыдущему. Сдвиг влево, инвертирование и побитовое И. Биты сбрасываются.
ivan_fd Дата: Пт, 19.07.2019, 15:51  |                                                                                                                Сообщение # 3
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1071
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
На мой взгляд он написан в стиле СИ.


Если точнее, то в стиле VisualBasic.
И в Протоне код выглядел бы, почти так же.

Код
For counter = 0 to 7
      LATA = LATA  | (1 << counter)
      LATB = LATB  | (1 << counter)
      LATC = LATC  | (1 << counter)
      LATD = LATD  | (1 << counter)
      LATE = LATE  | (1 << counter)
      DelayMS(1000) 
Next


Меня все время преследуют умные мысли...но я быстрее!!!
vladh Дата: Сб, 20.07.2019, 06:13  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата kits ()
Сдвиг 1 влево на число в переменной counter, а после побитовое ИЛИ LATA. Производится установка бита указанного в переменой counter. То есть если в ней был 0, установится 0 бит, если 2, установится 2 бит.

Спасибо, kits. Но вот почему выполнение операций идет не так как я думаю? Согласно правилам математики выполняются операции выполняются слева направо. Этот порядок нарушается если имеются выражения в скобках или операции умножения/деления. Т.е. Во втором цикле как бы все становится на  места описанные вами(там присутствуют скобки). А вот в первом почему не так?

Добавлено (20.07.2019, 06:23)
---------------------------------------------

Цитата ivan_fd ()
И в Протоне код выглядел бы, почти так же.

Спасибо, Иван. Но вот сейчас я обратил внимание на одну вещь. Я попробовал Ваш код засунуть в Протон. Действительно почти все прошло без ругательств(кроме DelayMs(1000)). Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете?
ivan_fd Дата: Сб, 20.07.2019, 11:25  |                                                                                                                Сообщение # 5
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1071
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
Согласно правилам математики выполняются операции выполняются слева направо. Этот порядок нарушается если имеются выражения в скобках или операции умножения/деления. Т.е. Во втором цикле как бы все становится на  места описанные вами(там присутствуют скобки). А вот в первом почему не так?


Тут немного не так как в математике. Каждый оператор имеет свой приоритет.
В первом случаи, логический сдвиг имеет выше приоритет, чем логическое ИЛИ, поэтому скобки не нужны.
Хотя поставить их не помешает, логичнее програма читается. Кстати в Протоне скобки нужны, иначе считает не верно.
Во втором:
Цитата vladh ()
LATA = LATA and not(1 << counter)

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

Цитата vladh ()
Спасибо, Иван. Но вот сейчас я обратил внимание на одну вещь. Я попробовал Ваш код засунуть в Протон. Действительно почти все прошло без ругательств(кроме DelayMs(1000)). Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете?

 
Вот из помощи ПРОТОНА:

Цитата
Logical operators
Bitwise and '&'
Bitwise or '|'
Bitwise xor '^'
Bitwise Shift Left '<<'
Bitwise Shift Right '>>'
Bitwise Complement '~'
Bitwise Reverse '@' Returns the logical AND of two values.


А на счет DelayMS(1000) . Какая версия протона у Вас. У меня 3.7.1.6.


Меня все время преследуют умные мысли...но я быстрее!!!
vladh Дата: Сб, 20.07.2019, 12:36  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
А на счет DelayMS(1000) . Какая версия протона у Вас. У меня 3.7.1.6.


У меня 3,5,8,6.
А все таки как насчет:
Цитата vladh ()
Но я никогда в своих программах не использовал ни символа "|", ни символа "&" и т.п. Я всегда писал "Or" и "And". Но вот сейчас я попробовал в Вашем коде заменить "|" на "Or" и тогда компилятор выдал ошибки. Что это значит, как Вы думаете?

Т.е. почему эти разные записи операторов не равноправны?

Сообщение отредактировал vladh - Сб, 20.07.2019, 12:38
ivan_fd Дата: Сб, 20.07.2019, 15:31  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1071
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне.
Не OR, а |.


Меня все время преследуют умные мысли...но я быстрее!!!
vladh Дата: Сб, 20.07.2019, 18:29  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне.Не OR, а |.


Иван, Вы наверное меня не поняли(или я чего то понять не могу). Я обычно в своих программах на Протоне использую логический оператор Or и никогда "|". Например кусок кода моей программы:

Цитата
Repeat
GoSub KeyPad
Until Key = 1 Or Key = 2 Or Key = 3 Or Key = 4 Or Key = 11


Этот код компилируется без проблем. Даже если я поменяю Or на |.
Когда же в Вашем примере я попытался вертикальную черту заменить на этот оператор компилятор высказал мне своё фи. Почему? Когда можно использовать Or, а когда |?

Сообщение отредактировал vladh - Сб, 20.07.2019, 18:36
kits Дата: Сб, 20.07.2019, 18:52  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

В многих бейсиках Or это логический, а | битовый оператор.
То есть первый используется как в вашем примере с Until, а второй для установки битов.
ivan_fd Дата: Сб, 20.07.2019, 20:24  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 1071
Репутация: 83   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Теперь понял, что Вы имели ввиду. Вам выше уже ответили.
Можете, так же посмотреть файл помощи:
Boolean Logic Operators


Меня все время преследуют умные мысли...но я быстрее!!!
vladh Дата: Вс, 21.07.2019, 08:29  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

kits и ivan_fd, большое вам спасибо. Очередной раз заглянув в Help обратил внимание, что Or и | это разные операторы. Они относятся к разным группам и выполняют разные функции. А это значит, что механическая их замена будет неправильным действием! И еще. Я до этого никогда не задумывался над тем, что у логических операторов также присутствует разделение по старшинству. Иван правильно обратил внимание, что желательно всегда ставить скобки дабы не было путаницы.
Сообщение отредактировал vladh - Вс, 21.07.2019, 08:37
kits Дата: Вс, 21.07.2019, 13:27  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

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


Сообщение отредактировал kits - Вс, 21.07.2019, 13:28
vladh Дата: Пн, 22.07.2019, 06:42  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 307
Репутация: 9   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата kits ()
Посмотрите справку на интересующий бейсик. Должна быть таблица похожая на эту (это разновидность бейсика для компа).


В моем хелпе написано мало. Я нашел только это:

Цитата
The  boolean  operands  do  have  a  precedence  within  a  condition.  The  and  operand  has  the

highest priority, then the or, then the xor. This means that a condition such as


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

Сообщение отредактировал vladh - Пн, 22.07.2019, 06:50
Форум Picbasic.ru » Программирование МК » Mikrobasic » Как понять код?
  • Страница 1 из 1
  • 1
Поиск: