2014-10-04 106 views
1

我確信這已被問到,但我無法理解如何屏蔽8位寄存器。位屏蔽位寄存器

假設我有一個8位寄存器。這些位通過PORTD設置。我想改變除2個LSB以外的所有位。

PORTD |= 0b111011XX; 

XX是我不想改變的2個LSB。

我該怎麼做?

+0

「我想改變除[...]之外的所有位」 - 6位高位全部被翻轉?這需要XOR('^')而不是OR('|')... – mafso 2014-10-04 13:18:30

回答

2

如果你想保留明確你的目的,你可以在屏蔽部分從您所設置的值分開,如:

PORTD |= 0b11101100 & ~0b00000011 

這將在任何情況下得到優化,但將清楚地解釋你正在設置的內容以及你想保留的內容。

2

試試這個:

PORTD |= 0b11101100; // bitwise-OR-ing with 0 retains the original 

如果你想上掀6位,並想要保留低2位,你需要做的:

PORTD ^= 0b11111100; // bitwise-XOR-ing with 1 reverses the bit and with 0 retains