Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja z argumentami oddzielonymi operatorem alternatywy logicznej.

Ostatnio zmodyfikowano 2016-10-14 12:33
Autor Wiadomość
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.
P-152514
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 :)
C/C++
byte bit5 = b00010000;
byte bit4 = b00001000;
byte zmienna = 0;
//ustaw bit 5 zmiennej
zmienna |= bit5;
//ustaw bit 4 w zmiennej;
zmienna |= bit4;
P-152515
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ć.
P-152516
mateczek
» 2016-10-13 10:25:43
maska to zwykła liczba nie trzeba kombinować
C/C++
#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;
    //2^4+2^5 =32+16=48
    setBit( slowo, maska | maska2 );
    std::cout << slowo << std::endl;
}
P-152517
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

C/C++
#include <iostream>
#include <bitset>
using namespace std;

typedef bitset < 8 > byte;

byte bit2 = 2; // = b10;
byte bit1 = 1; // = b01;
byte zmienna = 0;



void funkcja( byte x ) {
    if( x == 3 ) cout << "Udalo sie" << endl;
    else cout << "Failure" << endl;
   
}
int main()
{
    funkcja( bit2 | bit1 );
}
P-152518
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 !!!
P-152519
karambaHZP
» 2016-10-13 12:17:03
P-152520
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:
maski bitowe.
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.



P-152534
« 1 » 2
  Strona 1 z 2 Następna strona