PORTB = (PORTB & ~ 0xfc) |(b & 0xfc);
Разбивка:
PORTB = PORTB & ~0xFC
0xFC = 1111 1100
~0xFC = 0000 0011
PORTB = PORTB & 0000 0011
Выбирает два младших бита PORTB
.
b & 0xFC
0xFC = 1111 1100
Выбирает верхний6 битов b.
ИЛИ их вместе, PORTB
будет содержать шесть старших бит b и два младших бита PORTB
.
PORTD = (PORTD &~ 0x30) |((b << 4) & 0x30); </p>
Разбивка:
PORTD = PORTD & ~0x30
0x30 = 0011 0000
~0x30 = 1100 1111
PORTD = PORTD & 11001111
Выбирает все, кроме 4-го и 5-го (считая от 0) битов PORTD
(b << 4) & 0x30
Рассмотрим b как поле битов:
b = b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0
b << 4 = b3 b2 b1 b0 0 0 0 0
0x30 = 0011 0000
(b << 4) & 0x30 = 0 0 b0 b1 0 0 0 0
ИЛИ две части вместе, PORTD
будет содержать 0-й и 1-й биты b
в своих 4-м и 5-м битахи исходные значения PORTD в остальном.