lukhol Temat założony przez niniejszego użytkownika |
Funkcja z argumentami oddzielonymi operatorem alternatywy logicznej. » 2016-10-13 09:47:50 Witam, zastanawiam się jak działają funkcje, do których jako argument można wysłać 2 rzeczy oddzielone operatorem alternatywy logicznej. Dla przykładu w WinApi, w celu utworzenia MessageBoxa można zrobić to następująco: MessageBox( NULL, "To jest wiadomość.", "Wiadomość", MB_ICONINFORMATION | MB_OKCANCEL ); Interesuje mnie oczywiście czwarty argument w postaci MB_ICONINFORMATION | MB_OKCANCEL. Jak napisać funkcję, która przyjmuje taki parametr? Interesuje mnie przykład lub jakieś odwołanie do strony/literatury gdzie będę mógł sobie o tym poczytać. Niestety sam nic nie znalazłem. |
|
mateczek |
» 2016-10-13 10:13:11 maski bitowe. To nie alternatywa logiczna pwenie pomyliło Ci się z podwójnym znakiem "||" któy oznacza właśnie "lub". Pojedyńczy znak to zwykły OR :) byte bit5 = b00010000; byte bit4 = b00001000; byte zmienna = 0;
zmienna |= bit5;
zmienna |= bit4; |
|
lukhol Temat założony przez niniejszego użytkownika |
» 2016-10-13 10:15:45 Wiem jak działają maski bitowe, ale wciąż nie wiem jak napisać funkcję, która przyjmie mi taką maskę.
Edit: Mam już pomysł jak to zrobić, ale narazie nie mam jak sprawdzić. |
|
mateczek |
» 2016-10-13 10:25:43 maska to zwykła liczba nie trzeba kombinować #include<iostream> void setBit( unsigned short & s, unsigned short m ) { s |= m; }
int main() { unsigned short slowo = 0; unsigned short maska = 1 << 5; unsigned short maska2 = 1 << 4; setBit( slowo, maska | maska2 ); std::cout << slowo << std::endl; }
|
|
lukhol Temat założony przez niniejszego użytkownika |
» 2016-10-13 10:32:37 Dzięki za odpowiedz. W czasie gdy napisałeś mi przykład, sam ogarnąłem o co chodzi :D #include <iostream> #include <bitset> using namespace std;
typedef bitset < 8 > byte;
byte bit2 = 2; byte bit1 = 1; byte zmienna = 0;
void funkcja( byte x ) { if( x == 3 ) cout << "Udalo sie" << endl; else cout << "Failure" << endl; } int main() { funkcja( bit2 | bit1 ); }
|
|
mateczek |
» 2016-10-13 10:44:47 w kasie bitSet można ustawiać bity korzystając z operatora[] nie trzeba posówać się do masek bitowych w celu ustawienia lub skasowania bitów (zależy od sytuacji). Mechanizmy takie najczęściej się stosuje w programowaniu mikro-kontrolerów, Gdzie dla przykładu jest 16 bitowy rejestr i każdy bit odpowiada za coś innego !!! |
|
karambaHZP |
» 2016-10-13 12:17:03 |
|
Rashmistrz |
» 2016-10-13 20:52:22 oddzielone operatorem alternatywy logicznej. |
To jest bitowy operator alternatywy logicznej. // (binarna wersja to ta którą powiedziałeś) Przy nim wartość operandów nie jest brana jako true/false. Alternatywa taka jest obliczana równolegle na wszystkich bitach: 0000'1101 (13) 0001'0100 (14) --------- 0001'1101 (29) - wynik jak działają funkcje, do których jako (jeden) argument można wysłać (więcej) rzeczy |
Cała sztuczka polega na użyciu odpowiednio zakodowanych stałych, które mają w sobie ustawione odpowiednio bity tak by wykonanie na nich "wspólnej" alternatywy nie powodowało "kolidowania" bitów. Czyli nie miały ustawionych bitów na tych samych pozycjach. Z wyjątkiem tego, jeśli jest to pożądany efekt: Stała 'A' implikuje 'C' i 'B' implikuje 'C', to w obu stałych (A i B) bit odpowiedzialny za 'C' jest ustawiony. ) |
Reszta sztuczki polega na odczytaniu bitów wewnątrz funkcji, czego dowiedziałeś się z postów od poprzednich forumowiczów. sam ogarnąłem o co chodzi :D | bitset nie jest do tego potrzebny, ale nikt nie zabrania Ci tego w ten sposób użyć. _________________________________________________________________ @mateczek: Pomyliłeś pojęcia. To są flagi bitowe jak i szczególny przypadek pól bitowych. Maski bitowe służą do wyodrębniania bitów i są używane do tego, żeby zaaplikować daną operację tylko dla wybranych bitów. Maska bitowa zawsze ma szerokość słowa, taką jak zmienna na której mamy zamiar wykonać operację bitową dla danych bitów. |
|
« 1 » 2 |