Побитовое |
- Войдите на сайт для отправки комментариев
Пнд, 28/05/2018 - 11:14
Подскажите, правильно ли я понимаю, что при такой записи( мождет атк нормальные люди вообще не пишут, но тем не менее
если бит ADSC на данный момент установлен в 1, то
ADCSRA |= (0 << ADSC);
такая запись не установит этот бит в 0, а такая
ADCSRA = (0 << ADSC);
установит?
вторая запись установит ВСЕ биты ADCSRA в 0
сначала надо в промежуточном регистре сделать маску. установить бит ADSC в 1 и инвертировать. а потом сделать & ADCSRA и получившейся маски.
пф, ахаха, серьезно?? вот это поворот...а потом я удивляюсь, почему у меня все работает непойми как
как понимаю, нужно писать как-то так7
да
еще можно отаквот
https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bi...
ADCSRA - 0b10000000 (aden = 1)
0 << ADSC -0b00000000
0b10000000|0b00000000 = 0b10000000
то есть останется так же единица
да уж...вт так живешь живешь, а тут такой снего на голову, ахахх, спасибо, что помогли разобраться)
а как тоглда, к примеру, написать вот такую строчку
по отделоьности, SMCR& = ~((1 << SM2)|(1 << SM0))
и SMCR| = (1 << SM1)
или можнно как-то в 1 строку упихнуть?
чем вдумчиво изучать битовые операции, используй лучше ардуинкины setBit() и clearBit(). Папрастому.
но ведь я уже вот почти полностью разобрался) мне к сожалению или к счастью больше нравится такая запись
чем вдумчиво изучать битовые операции, используй лучше ардуинкины setBit() и clearBit(). Папрастому.
Настоящие программисты не используют Паскаль!
я, конечно, не настоящий программист, но все же
а как тоглда, к примеру, написать вот такую строчку
по отделоьности, SMCR& = ~((1 << SM2)|(1 << SM0))
и SMCR| = (1 << SM1)
или можнно как-то в 1 строку упихнуть?
SMCR = SMCR & (~((1 << SM2)|(1 << SM0))) | (1 << SM1);
в одну строчку.
Наверняка есть решение короче. но сёдня чота башке болеть охота, думать ей лень.
все, суть я понял, примногоблагодарен
нальёшь, при случае.
SMCR = SMCR & (~((1 << SM2)|(1 << SM0))) | (1 << SM1);
в одну строчку.
А так можно записать : SMCR&=0b11111010; ?
Если в бите SM1 был 0, то результат будет не как требуется по логике.
Если в бите SM1 был 0, то результат будет не как требуется по логике.
нальёшь, при случае.
да я вам уже минимум два раза налить должен)
не, ну если в таком виде писать, то можно ведь и просто SMCR=0b11111010; написать
не, ну если в таком виде писать, то можно ведь и просто SMCR=0b11111010; написать
не, ну если в таком виде писать, то можно ведь и просто SMCR=0b11111010; написать
не, ну я имею ввиду, что если нам не важны остальные биты и, к примеру, они установленный в 0, то так же прописываем 0
SMCR=0b00000101;
ну а вообще, конечно, это опасно, можно ненароком перезаписать то, что не стоило бы трогать
Если другие биты не важны, то можно. Но я так понимаю , это дурной тон писать магические цифры. Хотя такая запись работает в разы быстрее, что может быть важно в , например, функциях, особенно в ф-ях прерывания.
Если другие биты не важны, то можно. Но я так понимаю , это дурной тон писать магические цифры. Хотя такая запись работает в разы быстрее, что может быть важно в , например, функциях, особенно в ф-ях прерывания.
насколько мне известно, не оч хорошо в прерывания пихать ф-ии
такая запись работает в разы быстрее,
В разы бастрее чего? Вы думаете, что
a = 0x04;
работает быстрее, чем
#define Bit_TWO 2
a = (1 << Bit_TWO);
Таки нет. Одинаково. Или Вы о чём-то другом?
такая запись работает в разы быстрее,
В разы бастрее чего? Вы думаете, что
a = 0x04;
работает быстрее, чем
#define Bit_TWO 2
a = (1 << Bit_TWO);
Таки нет. Одинаково. Или Вы о чём-то другом?
я думаю 5N62V имел ввиду, что вот это SMCR = 0b00001011; работает куда быстрее, чем вот это SMCR = SMCR & (~((1 << SM2) | (1 << SM0))) | (1 << SM1);, мне кажется так и есть
я думаю 5N62V имел ввиду, что вот это SMCR = 0b00001011; работает куда быстрее, чем вот это SMCR = SMCR & (~((1 << SM2) | (1 << SM0))) | (1 << SM1);, мне кажется так и есть
это не так. При компиляции вся длинная цепочка
(~((1 << SM2) | (1 << SM0))) | (1 << SM1);
заменяется одной константой
Реально это эквивалентно по времени одной операции SMCR = SMCR & X
Таки нет. Одинаково. Или Вы о чём-то другом?
Я полагаю, что запись SMCR = SMCR & (~((1 << SM2)|(1 << SM0))) | (1 << SM1); работает медленнее, чем
а я думаю быстрее...
В первой записи 2 действия, во второй - четыре.
это не так. При компиляции вся длинная цепочка
(~((1 << SM2) | (1 << SM0))) | (1 << SM1);
заменяется одной константой
Реально это эквивалентно по времени одной операции SMCR = SMCR & X
Хм. Я когда-то задался этим вопросом, прогнал на цикле 1000 раз и замерил время. Вариант просто присваивания значению регистру крутился в 4 раза быстрее, чем вариант со сдвигами и битовыми операциями.
Результат сравнения времени очень завсисит от того, являются аргументы константами или переменными
Результат сравнения времени очень завсисит от того, являются аргументы константами или переменными
насколько мне известно, не оч хорошо в прерывания пихать ф-ии
5N62V, я думаю, что при умолчательной (из коробки) оптимизации разницы быть не должно никакой. Но, поскольку хрен его знает, что там эта 02 наоптимизирует, я тоже проведу тест, как домой приду и выложу тогда.
насколько мне известно, не оч хорошо в прерывания пихать ф-ии
Чем это они так провинились? Нормально вполне. А что, по Вашему, делает attachInterrupt? Вы не поверите, но организует вызов Вашей функции из обработчика прерывания.
я тоже проведу тест
и вот результат:
Ну, собственно так и должно быть из общих соображений.