2013-02-24 2 views

Répondre

4

C'est bitwise OU. C'est utile dans ce cas pour composer des bitmasks. Ces drapeaux sont définis pour un nombre qui a un bit défini, et lorsque vous les combinez ensemble, vous obtenez un nombre avec les deux bits définis.

exemple: Je ne sais pas quelle est la valeur exacte de ces drapeaux est, mais imaginons qu'ils sont:

#define GL_COLOR_BUFFER_BIT 0x01 
#define GL_DEPTH_BUFFER_BIT 0x08 

Si vous écrivez ceux en binaire, vous obtenez:

GL_COLOR_BUFFER_BIT = 00000001 
GL_DEPTH_BUFFER_BIT = 00001000 

Et si vous ou ceux ensemble au niveau du bit, vous définissez le bit dans la sortie 1 si ce bit est soit GL_COLOR_BUFFER_BITOUGL_DEPTH_BUFFER_BIT, donc:

GL_COLOR_BUFFER_BIT = 00000001 
GL_DEPTH_BUFFER_BIT = 00001000 
        = 00001001 

Donc, vous vous retrouvez avec le numéro 0x09.

La fonction que vous appelez examinera le numéro transmis, et sur la base duquel les bits sont définis, il sait ce que vous drapeaux en passant.

+0

Pouvez-vous expliquer un peu plus de détails sur exactement ce que vous voulez dire? – user2101672

+0

Merci pour l'explication! – user2101672

0

Il est un opérateur ou au niveau du bit. Bitwise ou fonctionne comme indiqué ci-dessous:

Supposons que vous avez 2 octets a, b. Les opérateurs bit à bit fonctionnent sur un bit level. Ce qui se passe est qu'il prend chaque bit à son tour et effectue une opération ou sur elle. Si au moins un (ou les deux) bits est 1s, le bit correspondant dans l'octet de résultat sera également un. Si elles sont à la fois 0 résultat le bit sera également 0.

Ainsi Bitwise ou a et b fera ceci:

a = 0 0 1 1 0 1 0 1 

b = 1 0 1 1 0 0 0 0 

c = 1 0 1 1 0 1 0 1 

Premier bit 0 et 1. Il y a un 1 si peu en c sera un 1. Deuxième bit 0 et 0, le bit de résultat suivant sera un 0. Troisième bit les deux 1s. Au moins un 1 est présent, donc le prochain bit dans c sera un 1 ... et ainsi de suite.

Espérons que cela vous le permette.

PS. J'ai utilisé des bits factices ici et en aucun cas ils correspondent aux valeurs réelles utilisées par GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT.

La plupart des opérateurs de bits sont utilisés pour appliquer un masque sur une valeur ou combiner deux valeurs ensemble.

| combinera les deux ensemble & va appliquer un masque

laisse supposer que vous donne une valeur et que vous voulez le faire ressembler à ceci (nous utiliserons & pour faire appliquer ce masque).

0 0 0 1 1 1 1 0 

0s correspondent aux endroits où il devrait y avoir aucune valeur et de 1 correspondent aux bits qui vous intéresse et que vous souhaitez extact.

a = 1 0 1 0 0 1 1 0 
mask = 0 0 0 1 1 1 1 0 

Maintenant, tous les bits qui sont un 0s ci-dessus seront supprimés et les résultats auront dans ces bits 0s car et & vous avez besoin des deux bits à 1s pour résultat un peu 1.

Où vous avez 1s dans le masque, c'est où le potentiel 1s dans le résultat se produira. Donc, en utilisant & sur chaque bit, vous obtenez cette valeur. Si vous regardez de plus près les 4 bits dans le résultat qui sont dans la même position que 1s dans le masque sont simplement déplacés de a. Donc, ce qu'il a vraiment fait a été enlevé les bits dans un masque où avait un 0 et gardé ceux avec 1s.

0

Cela dépend un peu de la langue que vous utilisez, mais dans beaucoup c'est bitwise or. Ceci est souvent utilisé pour passer plusieurs drapeaux qui sont codés comme un bit dans une fonction. Par exemple, si vous avez deux drapeaux

const char FLAG_1 = 0x01; 
const char FLAG_2 = 0x02; 

alors FLAG_1 | FLAG_2 est 0x03. Pour les bits disjoints bitwise c'est équivalent à l'addition, ce qui peut être déroutant au premier abord. Dans l'appel, les bits sont séparées par OR

func(FLAG_1 | FLAG_2) // set both FLAG_1 and FLAG_2 

La fonction func peut alors tester les bits individuellement à l'aide bitwise and:

void func(char flags) { 
    if(flag & FLAG_1) { // test for FLAG_1 
    } 
    if(flag & FLAG_1) { // test for FLAG_2 
    } 
}