Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: terrarus, ivan_fd  
Форум Picbasic.ru » Программирование МК » Mikrobasic » Как понять код?
Как понять код?
vladh Дата: Пт, 19.07.2019, 10:07  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 4   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Потому, что в Протоне такой синтаксис. В МикроБейсике другой. В C, например, так же как и в Протоне.
Не OR, а |.
vladh Дата: Сб, 20.07.2019, 18:29  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 4   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

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

Статус: Offline

Теперь понял, что Вы имели ввиду. Вам выше уже ответили.
Можете, так же посмотреть файл помощи:
Boolean Logic Operators
vladh Дата: Вс, 21.07.2019, 08:29  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

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

Статус: Offline

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


Сообщение отредактировал kits - Вс, 21.07.2019, 13:28
vladh Дата: Пн, 22.07.2019, 06:42  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Antonionwo Дата: Ср, 22.06.2022, 00:13  |                                                                                                                Сообщение # 14
Группа: Заблокированные
Ранг:  Пытаюсь разобраться
Сообщений: 51
Репутация: 0   ±
Замечания:   ±
На сайте с 31.01.2021

Статус: Offline

Добрый день друзья!
Предлагаем Вашему вниманию замечательный сайт https://dengi-do-zarplaty.ru/
Конечно, никто не хочет давать деньги в долг и особенно никому не хочется брать их взаймы. Но иногда ситуация решает за нас и приходится очень срочно искать, откуда взять деньги. В первую очередь обычно обращаются к родственникам, друзьям, коллегам по работе, партнерам по бизнесу, но во многих случаях они могут отказать. Хорошим выбором будет обратиться в финансовую компанию, в которой можно на выгодных условиях взять кредит, чтобы улучшить свое положение. Причем важно не только оформить кредит быстро с хорошими требованиями, но и взять кредит наличными под низкий процент. Никто не хочет влезать в долги, которые еще не понятно, как придется отдавать.


тонировка окон пвх
Bogdanevc Дата: Пт, 21.07.2023, 13:18  |                                                                                                                Сообщение # 15
Группа: Заблокированные
Ранг:  Новенький
Сообщений: 3
Репутация: -3   ±
Замечания:   ±
На сайте с 27.12.2020

Статус: Offline

Здравствуйте друзья.

Предлагаем Вашему вниманию интересный сайт для заказа услуг стоматологии в Минске.К вашим услугам лучшие стоматологи Минска с многолетним стажем.стоматология минск,удаление зуба, отбеливание зубов,лечение зуба,удаление зуба мудрости,стоматология минск цены и стоматология платные услуги минск.
Стоматология премиум-класса в Минске.Приветствуем Вас на официальном сайте стоматологической поликлиники в Минске. С 2008 года мы оказываем гражданам Беларуси, России, Украины, Казахстана, Германии, Англии и других стран СНГ и Европы стоматологические услуги высокого качества.Наша стоматология работает ежедневно и находится в Московском районе Минска, в микрорайоне Малиновка.Мы гордимся тем, что собрали первоклассную команду врачей-стоматологов, которые любят свою работу и делают ее хорошо.Платная стоматология в Минске.Мы – платная стоматология, но цены у нас не кусаются. При этом мы оснастили наши кабинеты современным дорогим оборудованием и инструментами. Мы знаем, что без крепкого здоровья сложно быть счастливым, поэтому приобретаем для лечения только надежные и безопасные материалы. Они обеспечат долговечность итогам лечения, протезирования, имплантации и др. Уже 10 лет благодаря высокотехнологичному оснащению и своему мастерству наши опытные врачи безболезненно проводят сложные манипуляции в ротовой полости и восстанавливают даже безнадежные зубы. Мы беремся за сложные задачи.Получить консультацию в частной стоматологии Вы можете онлайн или записавшись к нам на прием.Стоматология в Беларуси для всей семьи.Нас называют «семейная стоматология», и не зря. Ведь мы предоставляем услуги женщинам и мужчинам любых возрастов, а также детям от 14 лет. К нам приходят целыми семьями, чему мы очень рады, ведь это говорит о том, что мы двигаемся в правильном направлении.Мы выражаем огромную благодарность людям, которые рекомендуют нас своим друзьям и знакомым, которые пишут искренние отзывы о нашей работе и остаются с нами на протяжении многих лет. Ваши отзывы и радостная улыбка – это лучшая благодарность нам, это наше все, и мы этим очень гордимся. Спасибо Вам!
От всей души Вам всех благ!
имплантация зубов цены акции
профессиональная гигиеническая чистка зубов
сколько стоит полировка зубов
airflow минск
гигиена полости рта у взрослых
протезирование на 6 имплантах
имплантация московский район
установка одного импланта зуба straumann
воспалилась десна зуб удаление
лучшая анестезия при удалении зуба
сколько отходит анестезия после лечения зуба
рентген зуба минск
удаление зубов перед имплантацией
протезирование металлокерамическими коронками
отличие циркониевой и металлокерамической коронки
лучшие клиники по имплантации зубов
металлические лигатурные брекеты
съемные зубные протезы на 2 зуба
виды металлокерамических коронок на зубы
профессиональная чистка зубов с брекетами
фотоотбеливание зубов цена
пластинка для зубов съемная верхнего неба
лечение гранулирующего периодонтита
пульпит клиника диагностика лечение
профессиональная гигиена полости рта как часто
сколько стоят керамические брекеты
гемостатическая губка после удаления зуба
элайнеры описание
стоматологии г минска
съемные зубные протезы виниры
имплантация 21 зуба
стоматология проспект дзержинского минск
сколько занимает профессиональная чистка зубов
заживление лунки после удаления зуба мудрости
депульпировать зуб под металлокерамику
имплантация 3 зубов подряд
коронки с керамической облицовкой
удаление 1 зуба
удаление 8 зуба
удаление зуба мудрости губка
виниринг зубов
гель для отбеливания зубов
удобные съемные зубные протезы
элайнеры для выравнивания зубов цена
зубной съемный протез коррекция
имплант с циркониевой коронкой под ключ
аппарат снятия зубных отложений
стоматология минск имплантация зубов
гингивопластика зубов
имплантация передних верхних зубов


уровни купить
Форум Picbasic.ru » Программирование МК » Mikrobasic » Как понять код?
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: