|
0 / 0 / 0
Регистрация: 13.12.2014
Сообщений: 4
|
|
Как работают побитовые сдвиги?13.04.2007, 19:36. Показов 88419. Ответов 58
Метки нет (Все метки)
0
|
|
| 13.04.2007, 19:36 | |
|
Ответы с готовыми решениями:
58
Побитовые сдвиги Побитовые сдвиги
|
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||
| 29.12.2017, 11:35 | ||
|
0
|
||
|
|
|||
| 29.12.2017, 12:02 | |||
|
Ты же хватаешь по верхам статьи из гугла. Наверное надеешься "по-быстрому выучить С++". Я проверил, эта статья на первых местах в яндексе в выдаче. Я тебе говорю - сходи в книжный магазин и купи бумажную чёртову книгу, а не гугли вразнобой каждый новый вопрос, что возникает. У тебя клиповое мышление в области программирования формируется. Добавлено через 4 минуты Где ты сдвиг увидел? В выражении (1<<RXEN)|( 1<<TXEN) ? Тебе уже объяснили, что RXEN и TXEN это не регистры. Почему после этого у тебя ещё какие-то вопросы остались?
0
|
|||
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
|||
| 03.01.2018, 01:42 | |||
|
Добавлено через 2 минуты Я там выше, когда задавал вопрос, сам об этом писал: Зачем же обьяснять человеку то, что он и сам знает?
0
|
|||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
||||||
| 14.02.2020, 12:06 | ||||||
|
Подниму тему, ибо так пишут для микроконтроллеров достаточно часто, забывая что в "стандарте" есть привет из позапрошлого века, а именно: int по умлочанию 32 бита, и числеки из #define часто по умолчанию получают или столько же или, в лучшем случае 16бит, что резко отличается от байтовых регистров микроконтроллеров и в связи с чем возможны разные неожиданности в коде, особенно когда размер сдвига в байтовой переменной.
Но .. как-то надо писать "переносимый код", а управляющие регистры и их битики частенько "гуляют" по описаниям .. Почему не попробовать так?
Почему не применяется?
0
|
||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 14.02.2020, 14:05 | |
|
Arhat109, в стандарте С++ чётко записано - "что записал в union - то и должен считать, а что будет происходить если записал одно, а считал другое - неизвестно". То есть в общем случае твой код может оказаться непереносимым на некоторую абстрактную платформу.
0
|
|
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
||
| 14.02.2020, 14:12 | ||
|
А в чем тут плохая переносимость, кроме порядка следования битовых полей в битовой части union? По мне так как раз это честнее и переносимей чем константные сдвиговые операции. Мало того, что размер константы #define не очень-то определено "что это" .. так ещё и сдвиговые операции в стандарте тащат за собой шлейф из древних мэйнфреймов .. Поясните, если не трудно. Интересно.
0
|
||
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
| 14.02.2020, 14:17 | |
|
0
|
|
|
4068 / 2702 / 433
Регистрация: 09.09.2017
Сообщений: 12,019
|
|
| 14.02.2020, 14:23 | |
|
Ваша запись не позволяет одновременно поменять несколько полей, скажем, при инициализации. Нет, записать в U_CSRB.r8 можно, но там уже совсем другой синтаксис и другие имена констант.
Ну и не все компиляторы умеют эффективно работать с битовыми полями. Я когда-то пытался такое провернуть с портами на avr-gcc и обнаружил, что вместо sbi/cbi он использует чтение-модификацию-запись. Не исключаю, что с тех пор пофиксили.
0
|
|
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
||||||||||||
| 14.02.2020, 14:32 | ||||||||||||
![]() Забавно что rjmp безусловный в функции _spiWait() получился ..
0
|
||||||||||||
|
4068 / 2702 / 433
Регистрация: 09.09.2017
Сообщений: 12,019
|
||||||||||||
| 14.02.2020, 15:20 | ||||||||||||
0
|
||||||||||||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 14.02.2020, 20:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Добавлено через 4 минуты
В остальном для той же самой цели.. Добавлено через 3 минуты P.S. Так и осталось пока непонятным какого фига оптимизатор выбрасывает кусок кода, и заменяет условное ветвление по флагу на безусловный переход, выкидывая остальной код. И это при том, что регистр SPSR в io.h верно прописан как volatile и присваивается он первому попавшемуся регистру из пула (r24) .. в общем, пока "время кончилось". Позже. ![]() Добавлено через 46 минут Все же поковырялся ещё немного .. обнаружил такое (вынес все остальное, оставил вообще "оригинал" со сдвигом на константу):
Добавлено через 10 секунд Все же поковырялся ещё немного .. обнаружил такое (вынес все остальное, оставил вообще "оригинал" со сдвигом на константу):
Добавлено через 5 секунд Все же поковырялся ещё немного .. обнаружил такое (вынес все остальное, оставил вообще "оригинал" со сдвигом на константу):
Добавлено через 3 минуты Сайт лежит что-ли? Потрите лишние дубли, пожалуйста! Добавлено через 3 часа 2 минуты В общем слегка разобрался, но не понял отчего это компилятор ведет себя именно так. Кому если интересно, то вся засада в операции побитовой инверсии ~ Выражение внутри while вычисляется неверно при любом варианте перед ней:
Это - нормальное поведение? Добавлено через 8 минут
~0xFF что получим? Добавлено через 23 минуты Продолжаем ..
0
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,474
|
||||||
| 14.02.2020, 20:05 | ||||||
|
тема интересная, надо будет изучить ответы пользователей (прям сейчас мне это делать лень
)Kash, для себя я составил небольшую шпаргалку Кликните здесь для просмотра всего текста
Может вам тоже пригодится
0
|
||||||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
||||||
| 14.02.2020, 20:19 | ||||||
|
Перенабирая, ошибся, правильный тест этот:
На этом вопрос можно считать практически закрытым.
0
|
||||||
|
4068 / 2702 / 433
Регистрация: 09.09.2017
Сообщений: 12,019
|
|||
| 14.02.2020, 22:22 | |||
|
Добавлено через 7 минут Поэкспериментировал. В общем-то, результат вполне логичен: поле b0 у вас объявлено как uint8_t. Соответственно, занимает-то оно один бит, но во всех операциях приводится к полноценному типу, 8-битному. А побитовая инверсия 0b00000001 равна (кто бы мог подумать) 0b11111110. Вывод остается прежним: для логических операций используйте логические, а не побитовые операторы.
1
|
|||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
|||
| 15.02.2020, 17:35 | |||
|
COKPOWEHEU, верно. Логическое отрицание (не бывает логической инверсии) - работает правильно, как и ожидалось.
То, что логический бит приводится к полноценному типу - есть интуитивно, несколько не ожиданное действие, что и показал выше. А самое забавное тут в том, что логическая инверсия "полноценного типа" в виде значения 0xFF не работает так, как ожидается, так как: ~0xFF => ~0b1111_1111 => 0b0000_0000 => 0, не смотря на "warning: promoted ~unsigned is always non-zero [-Wsign-compare]" Что с этим делать? Ах, да! Там же promoted .. ![]() P.S. К сожалению, как раз в рамках обсуждения имеем полновесный ответ на вопрос "почему не используется объединение с побитовым описанием структуры физического регистра?" Ответ в вашем сообщении и выше и, сокращая получаем: инверсия бита в С/с++ НЕ может быть нулем .. что есть абсурд для любого управляющего бита, почти любого управляющего регистра .. вот, так и живем. ![]() Добавлено через 2 часа 17 минут
0
|
|||
|
4068 / 2702 / 433
Регистрация: 09.09.2017
Сообщений: 12,019
|
|||||
| 15.02.2020, 21:43 | |||||
Тем более когда биты расположены вразнобой, да еще в нескольких регистрах (таймеры, например). Тут по-человечески вообще не представить. А может быть просто привычка. Битовые поля это все же экзотика. В любом случае, вам никто не мешает написать свою реализацию. Хотя бы ради "защиты от дурака" (чтобы нельзя было выставить в регистре бит, которого там нет) пригодится.
0
|
|||||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
|||
| 17.02.2020, 07:20 | |||
|
Проблема в том, что в нем же содержится бит ошибки коллизии передачи - WCOL. К сожалению, он точно также сбрасывается этим самым "первым чтением": The WCOL bit is set if the SPI Data Register (SPDR) is written during a data transfer. The WCOL bit (and the SPIF bit) are cleared by first reading the SPI Status Register with WCOL set, and then accessing the SPI Data Register. .. что не позволяет без записи в регистр (локал) узнать а была ли коллизия при работе интерфейса... я про этот момент писал, и цель сохранения в регистровом локале - как раз эта. Инверсия бита - есть "операция", дающая результат, который подлежит (согласно стандарту) тому самому promoted, что приводит к абсурде согласно ему же и .. может НЕ реализовываться разработчиком компилятора. То, что как показал это не всегда так .. ну так всегда можно сослаться на разные режимы для promoted и без такового.. А вот логическое отрицание - это работа с флагами процессора и поиск нужного варианта ветвления. И это основное применение "логических операций" .. то, что они побочно дают "результат", который можно сохранять .. ну так опять же можно реализовать проверкой флага и записью с .. все тем же promoted .. ![]() Поэтому логическое отрицание - работает верно. Сначала применяем, и за ненадобностью не делаем promoted, а вот с инверсией - все наоброт: сначала промоутим, а потом смотрим "а что надо-то было?" ![]() Вот эти "тонкости" стандарта и реализаций я и хотел показать этим примерном в разделе "начинающим" .. к сожалению, с "битовой арифметикой" там могут ещё вылезти нюансы (сейчас плохо помню где конректно, но того же плана), вот кмк, поэтому она и не применяется. Надо "смотреть в оба" как за стандартом, так и за компилятором..
0
|
|||
|
4068 / 2702 / 433
Регистрация: 09.09.2017
Сообщений: 12,019
|
||||
| 17.02.2020, 10:25 | ||||
|
Как еще можно описать, что пока не начнете читать-писать в SPDR ничего со статусным регистром не случится? Допустим, вы объявили переменную (поле класса) как struct{int var:1}svar; Формально ее тип все еще int. Соответственно, и для всех операций она будет приводиться к int. А потом результат операции приведется к типу результирующей переменной. Например, double dvar = svar.var+1; приведет к преобразованию int:1 -> int -> double. Так и у вас: оператор if требует в качестве аргумента целое число. Соответственно, каста к битовому полю и не происходит. Что посчиталось побитовой инверсией, то и попадет в условие. Другое дело - логическая инверсия (и прочие логические операторы тоже). Вот они приводят результат к диапазону [0,1] независимо от типа аргумента.
1
|
||||
|
56 / 20 / 2
Регистрация: 18.06.2018
Сообщений: 199
|
|||
| 17.02.2020, 10:46 | |||
|
Добавлено через 2 минуты
0
|
|||
| 17.02.2020, 10:46 | |
|
Программа на побитовые сдвиги
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне.
Это уже новая модель, модель сукцессии грибной.
потоки фосфора, азота. Углерода.
5 видов организмов.
Я даже. . .
|
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ
Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
|
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем
Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026
. . .
|
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки
План доработки модели динамики микоризных симбиозов (EcM с гистерезисом)
Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
|
|
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
|
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
|
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание:
как одно здание порождает конфликты требований,
которые никто не планировал
Материалы для обсуждения с МГСУ · 2026
Рисунки внутри приложенного ворд файла.
Что за. . .
|
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования?
Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная.
Где разрыв
. . .
|