Другие языки программирования и технологии
PORTD|=0x02 PORTD&=0xFD объясните как так происходит что определенный бит устанавливается в 1 или 0 ?
а остальные на месте остаются.
Дак тут всё просто.
PORTD |= 0x02; - это то же самое, что PORTD = PORTD | 0x02;
То есть проводим операцию побитового "или" между тем, что в порту имеется и 0x02. Побитовое - это значит каждый битик из PORTD складывается по "или" с битиком числа 0x02. А если ты в курсе, что такое операция "или", то знаешь, что она принимает истинное значение если хотя бы один из операндов равен "истине".
Например, в порту D уже лежит значение 0b10110001, то выполнив операцию PORTD |= 0x02 ты получишь следующее: 0b10110001 | 0b00000010 = 0b10110011. Как видишь, установился 1-й бит, а остальные не изменились. Ну или на пальцах:
1 OR 0 = 1
0 OR 0 = 0
1 OR 0 = 1
1 OR 0 = 1
0 OR 0 = 0
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
Это мы рассмотрели установку определенного бита в "1". А как работает второе выражение, устанавливая определенные биты в "0" - попытайся подумать сам, помня, что операция "И" даёт "0" если хотя бы один из битов равен нулю.
PORTD |= 0x02; - это то же самое, что PORTD = PORTD | 0x02;
То есть проводим операцию побитового "или" между тем, что в порту имеется и 0x02. Побитовое - это значит каждый битик из PORTD складывается по "или" с битиком числа 0x02. А если ты в курсе, что такое операция "или", то знаешь, что она принимает истинное значение если хотя бы один из операндов равен "истине".
Например, в порту D уже лежит значение 0b10110001, то выполнив операцию PORTD |= 0x02 ты получишь следующее: 0b10110001 | 0b00000010 = 0b10110011. Как видишь, установился 1-й бит, а остальные не изменились. Ну или на пальцах:
1 OR 0 = 1
0 OR 0 = 0
1 OR 0 = 1
1 OR 0 = 1
0 OR 0 = 0
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
Это мы рассмотрели установку определенного бита в "1". А как работает второе выражение, устанавливая определенные биты в "0" - попытайся подумать сам, помня, что операция "И" даёт "0" если хотя бы один из битов равен нулю.
Смотря как ты глубоко капаешь !
Если тебе интересна сама структура то тут все просто - представь транзистор - он может принимать два положения - замыкать цепь и размыкать - восемь транзисторов это один байт - один транзистор это один бит !
В коде выглядит так - 00000000 (1 байт - все транзисторы открытые) - предположим что мне нужно записать некие данные - я посылаю сигнал нужному транзистору и он закрывается (тем самым замыкает цепь)
в итоге комп считывает этот байт и после оприделяет что за значение в нем имелось в виду !
Теперь что бы записать нужный байт это хорошо показывает Матрицы которые нужны для расчета 3д графики (в играх) - Не буду обьяснять эта тема длинная - приведу проще пример !
Для таких вещей обычно создают макросы - со значениями от 0х00000001 и до 0х10000000 - то есть один бит двигается в лево - восемь макросов
Предположим тебе нужно в байте устоновить 3 - 5 и 8 бит в еденицу (я не буду приводить макросы а в место них подставлю ихние значения)
Так вот берешь свой байт
char bayt =0; // 0х00000000
и далее просто сплюсовываешь макросами те байты которые нужно устоновить в еденицу
bayt = 0x00100000 + 0x00001000 + 0x00000001 ;
Далее вступает правило сложение битов (ничего сложного - тот же метод что и в десятичной )
00100000+
00001000+
00000001=
00101001
вот так выстовляют нужный бит в 1 или 0 !
Оригенальное все просто !
Если тебе интересна сама структура то тут все просто - представь транзистор - он может принимать два положения - замыкать цепь и размыкать - восемь транзисторов это один байт - один транзистор это один бит !
В коде выглядит так - 00000000 (1 байт - все транзисторы открытые) - предположим что мне нужно записать некие данные - я посылаю сигнал нужному транзистору и он закрывается (тем самым замыкает цепь)
в итоге комп считывает этот байт и после оприделяет что за значение в нем имелось в виду !
Теперь что бы записать нужный байт это хорошо показывает Матрицы которые нужны для расчета 3д графики (в играх) - Не буду обьяснять эта тема длинная - приведу проще пример !
Для таких вещей обычно создают макросы - со значениями от 0х00000001 и до 0х10000000 - то есть один бит двигается в лево - восемь макросов
Предположим тебе нужно в байте устоновить 3 - 5 и 8 бит в еденицу (я не буду приводить макросы а в место них подставлю ихние значения)
Так вот берешь свой байт
char bayt =0; // 0х00000000
и далее просто сплюсовываешь макросами те байты которые нужно устоновить в еденицу
bayt = 0x00100000 + 0x00001000 + 0x00000001 ;
Далее вступает правило сложение битов (ничего сложного - тот же метод что и в десятичной )
00100000+
00001000+
00000001=
00101001
вот так выстовляют нужный бит в 1 или 0 !
Оригенальное все просто !
Макс Шерматов
Если копать, как ты говоришь, глубоко, то тут не совсем всё просто. Если представить выход порта как один транзистор, то закрывшись, этот транзистор переведёт порт в состояние с высоким импедансом, а не в логический "0", как нам хотелось бы...
Похожие вопросы
- Знающие люди объясните мне пожалуйста разницу между 32 бит и 64 битом!
- Дано n строк по 3 элемента (1 и 0), найти сколько строк имеет больше чем один знак 1. C++
- Помогите расположить в порядке убывания. 1024 бита, 1000 байтов, 1 бит, 1 байт, 1 Кбайт
- зачем на тип данных bool (и эквивалентные ему в разные языках) выделяется целых 8 бит, если достаточно 1 бита?
- Переделать массив так чтобы сначала располагались 1 потом 0 потом 2
- (ax−1)(bx−1) < 0 на паскаль
- Сколько будет: 0 в нулевой степени? 1 или 0
- непонятки с return в программировании!!!!когда ставить return 1, return 0, и если без цифры....
- Как правильно расшифровываются цифры в версии какой-либо программы (например: 1.4.0.11)? Или как следует это делать?
- Вопрос по VBA(В Excel) Нужно решить y=x^2*cos(2x)+1 в 0->50 промежутке Дайте польный ответ или подзказки