| Zeile 71: | Zeile 71: | ||
Besonders bei hardwarenaher Programmierung kann man auf die Bit-Operatoren kaum verzichten. Sie sind nötig, da in [[Hardware]] einzelnen Bits oft dazu dienen einen Zustand der Hardware wiederzuspiegeln: Sie dienen als Flags. Da Software über die CPU aber immer nur auf Bytes zugreifen kann, und so den Zustand einzelner Bits nicht überprüfen kann verwendet man die Bit-Operatoren, um z. B. irrelevante Bits zu löschen oder bestimmte Bits zu setzen ohne den Zustand der anderen Bits zu beeinflussen. | Besonders bei hardwarenaher Programmierung kann man auf die Bit-Operatoren kaum verzichten. Sie sind nötig, da in [[Hardware]] einzelnen Bits oft dazu dienen einen Zustand der Hardware wiederzuspiegeln: Sie dienen als Flags. Da Software über die CPU aber immer nur auf Bytes zugreifen kann, und so den Zustand einzelner Bits nicht überprüfen kann verwendet man die Bit-Operatoren, um z. B. irrelevante Bits zu löschen oder bestimmte Bits zu setzen ohne den Zustand der anderen Bits zu beeinflussen. | ||
| − | === Bits | + | === Bits löschen === |
Um bestimmte Bits in einem oder mehreren Bytes zu löschen wird eine (Bit-)Maske benötigt. Die Maske gibt an welche Bits gelöscht werden sollen. | Um bestimmte Bits in einem oder mehreren Bytes zu löschen wird eine (Bit-)Maske benötigt. Die Maske gibt an welche Bits gelöscht werden sollen. | ||
Angenommen du hast ein Byte, dessen 5. Bit unbedingt ''0'' sein muss, weil es für eine Hardware-Funktion steht, die du ausschalten willst. | Angenommen du hast ein Byte, dessen 5. Bit unbedingt ''0'' sein muss, weil es für eine Hardware-Funktion steht, die du ausschalten willst. | ||
| Zeile 81: | Zeile 81: | ||
(????????b AND 11011111b) = ??0?????b | (????????b AND 11011111b) = ??0?????b | ||
| − | Das ganze funktioniert natürlich auch mit mehreren Bits gleichzeitig. | + | Das ganze funktioniert natürlich auch mit mehreren Bits gleichzeitig. |
| − | |||
| − | |||
| − | |||
C-Code: | C-Code: | ||
<c>PORTx &= ~(1 << BitNummer); // Bit in PORTx löschen</c> | <c>PORTx &= ~(1 << BitNummer); // Bit in PORTx löschen</c> | ||
| − | === Bits | + | === Bits setzen === |
Wie beim Löschen eines Bits wird auch hier eine (Bit-)Maske benötigt. Allerdings gibt sie diesmal an, welches Bit gesetzt werden soll. | Wie beim Löschen eines Bits wird auch hier eine (Bit-)Maske benötigt. Allerdings gibt sie diesmal an, welches Bit gesetzt werden soll. | ||
Um z. B. die Bits 1,4,5 auf ''1'' zu setzen erstellt man sich als Maske: 00110010b | Um z. B. die Bits 1,4,5 auf ''1'' zu setzen erstellt man sich als Maske: 00110010b | ||
Im Gegensatz zum Löschen wird jetzt allerdings mit einem einfachen OR verknüpft. | Im Gegensatz zum Löschen wird jetzt allerdings mit einem einfachen OR verknüpft. | ||
(????????b OR 00110010b) = ??11??1?b | (????????b OR 00110010b) = ??11??1?b | ||
| + | C-Code: | ||
| + | <c>PORTx |= (1 << BitNummer); // Bit in PORTx setzen </c> | ||
| + | === Bit testen === | ||
| + | Oft muss man auch testen, ob ein Bit gesetzt ist, um z.B. zu erfahren, ob man aus einem Port lesen darf. | ||
| + | Dafür löscht man einfach alle Bits, die nicht betrachtet werden sollen mithilfe der AND Verknüpfung. Ist das Resultat 0, dann war das betrachtete Bit gelöscht, andernfalls war es gesetzt. | ||
| + | (????????b AND 00100000b) = 00?00000b | ||
C-Code: | C-Code: | ||
| − | <c>PORTx | + | <c>if (PORTx & (1 << BitNummer) == 0) //bit gelöscht |
| + | else //bit gesetzt | ||