@@ -9,6 +9,7 @@ narrator: Deutsch Female
99import: https://raw.githubusercontent.com/liascript-templates/plantUML/master/README.md
1010 https://github.com/LiaTemplates/Pyodide
1111 https://github.com/LiaTemplates/AVR8js/main/README.md#10
12+ https://github.com/liascript/CodeRunner
1213
1314mark: <span style="background-color: @0;
1415 display: flex;
@@ -811,5 +812,113 @@ Zusammengesetzt ergibt sich eine Folgeadresse $0xe4$. Im Programmspeicher steht
811812
812813## Vorbereitung der praktischen Aufgaben
813814
814- + Anmeldung bei TinkerCad - https://www.tinkercad.com/
815- + Optional - Abholen eines Mikrocontrollers
815+ ** Bitoperationen in C**
816+
817+ | Operation | Bedeutung |
818+ | --------- | ----------------------- |
819+ | ` >> ` | Rechts schieben |
820+ | ` << ` | Links schieben |
821+ | `| ` | binäres, bitweises ODER |
822+ | ` & ` | binäres, bitweises UND |
823+ | ` ^ ` | binäres, bitweises XOR |
824+
825+ ``` cpp Bitshifting.cpp
826+ #include < iostream>
827+ #include < bitset>
828+
829+ int main ()
830+ {
831+ char v = 0x1;
832+ for (int i = 0; i <=7; i++){
833+ std::cout << std::bitset<8>((v<<i)) << std::endl;
834+ }
835+ return 0;
836+ }
837+ ```
838+ @LIA .eval(` ["main.c"] ` , ` g++ -Wall main.c -o a.out ` , ` ./a.out ` )
839+
840+ Mit diesen Operationen werden sogenannte Masken gebildet und diese dann auf die
841+ Register übertragen.
842+
843+ ### Setzen eines Bits
844+
845+ ``` cpp BitSetting.cpp
846+ #include < iostream>
847+ #include < bitset>
848+
849+ /* übersichtlicher mittels Bit-Definitionen */
850+ #define PB0 0
851+ #define PB1 1
852+ #define PB2 2
853+
854+ int main ()
855+ {
856+ char PORTB; // Wir "simulieren" die Portbezeichnung
857+ PORTB = 0;
858+ std::cout << std::bitset<8>(PORTB) << std::endl;
859+
860+ // Langschreibweise
861+ PORTB = PORTB | 1;
862+ std::cout << std::bitset<8>(PORTB) << std::endl;
863+ // Kurzschreibweise
864+ PORTB |= 0xF0;
865+ std::cout << std::bitset<8>(PORTB) << std::endl;
866+
867+ // Kurzschreibweise mit mehrteiliger Maske (setzt Bit 0 und 2 in PORTB auf "1")
868+ PORTB |= ((1 << PB0) | (1 << PB2));
869+ std::cout << std::bitset<8>(PORTB) << std::endl;
870+ }
871+ ```
872+ @LIA .eval(` ["main.c"] ` , ` g++ -Wall main.c -o a.out ` , ` ./a.out ` )
873+
874+ ### Löschen eines Bits
875+
876+ Das Löschen basiert auf der Idee, dass wir eine Maske auf der Basis der invertierten
877+ Bits generieren und diese dann mit dem bestehenden Set mittels ` & ` abbilden.
878+
879+ ``` cpp BitSetting.cpp
880+ #include < iostream>
881+ #include < bitset>
882+
883+ /* übersichtlicher mittels Bit-Definitionen */
884+ #define PB0 0
885+ #define PB1 1
886+ #define PB2 2
887+
888+ int main ()
889+ {
890+ char PORTB = ((1 << PB0) | (1 << PB2));
891+ std::cout << std::bitset<8>(PORTB) << std::endl;
892+
893+ PORTB &= ~ (1 << PB0);
894+ std::cout << std::bitset<8>(PORTB) << std::endl;
895+ }
896+ ```
897+ @LIA .eval(` ["main.c"] ` , ` g++ -Wall main.c -o a.out ` , ` ./a.out ` )
898+
899+ ### Prüfen eines Bits
900+
901+ ``` cpp BitSetting.cpp
902+ #include < iostream>
903+ #include < bitset>
904+
905+ /* übersichtlicher mittels Bit-Definitionen */
906+ #define PB0 0
907+ #define PB1 1
908+ #define PB2 2
909+
910+ int main ()
911+ {
912+ char PORTB = ((1 << PB0) | (1 << PB2));
913+ std::cout << std::bitset<8>(PORTB) << std::endl;
914+
915+ if (PORTB & (1 << PB0))
916+ std::cout << "Bit 2 gesetzt" << std::endl;
917+ if (!(PORTB & (1 << PB0)))
918+ std::cout << "Bit 2 nicht gesetzt" << std::endl;
919+ // Ist PB0 ODER PB2 gesetzt?
920+ if (PORTB & ((1 << PB0) | (1 << PB2)))
921+ std::cout << "Bit 0 oder 2 gesetzt" << std::endl;
922+ }
923+ ```
924+ @LIA .eval(` ["main.c"] ` , ` g++ -Wall main.c -o a.out ` , ` ./a.out ` )
0 commit comments