What does the & and | operators do in C++ (not referring to pointers)

YourFace

<span style="color:#9C9C9C;"><strong>Runner Up - T
Reaction score
91
Code:
else if( event.type == SDL_ACTIVEEVENT )
    {
        //If the window was iconified or restored
        if( event.active.state & SDL_APPACTIVE ) //what would that ampersand do
        {
            //If the application is no longer active
            if( event.active.gain == 0 )
            {
                SDL_WM_SetCaption( "Window Event Test: Iconified", NULL );
            }
            else
            {
                SDL_WM_SetCaption( "Window Event Test", NULL );
            }
        }

Code:
if(event.type == SDL_VIDEORESIZE)
	{
		screen = SDL_SetVideoMode(event.resize.w, event.resize.h, SCREEN_BPP, SDL_SWSURFACE | SDL_RESIZABLE); //what would that bitwise operator do

		if (screen == NULL)
		{
			windowOK = false;
			return;
		}
	}

what would the ampersand and | operator do? i added comments next to the parenthesis that they're in.
 

Artificial

Without Intelligence
Reaction score
326
The ampersand (&) and pipe (|) are bitwise operators. Read more about them: Bitwise operation - Wikipeda.

In many languages, such as C++, they can be used to make integers act as 'flag groups' (not really that sure about the terminology on this one). In a case like this the flags might be defined like this:
Code:
SDL_SOMETHING = 1
SDL_APPACTIVE = 2
SDL_FOOBAR    = 4
SDL_NODE      = 8
As you notice, they are integers with unique values that are power of two. The reason for these values is their binary representation:
Code:
SDL_SOMETHING 0001
SDL_APPACTIVE 0010
SDL_FOOBAR    0100
SDL_NODE      1000
Each of them has one, and only one, 1 in their binary representation, and in a unique position.

We can combine these flags using the bitwise or operator (the pipe):
Code:
state = SDL_SOMETHING | SDL_APPACTIVE
0001 | 0010

   0001
OR 0010
 = 0011

And we can check if a flag exists in a group using the bitwise and (the ampersand):
Code:
state & SDL_APPACTIVE
0011 & 0001

    0011
AND 0001
  = 0001
If the flag group didn't contain the given flag, the operation would return 0, which would be understood as false.

Code:
if( event.active.state & SDL_APPACTIVE ) //what would that ampersand do
It checks whether the flag group event.active.state contains the flag SDL_APPACTIVE.

Code:
screen = SDL_SetVideoMode(event.resize.w, event.resize.h, SCREEN_BPP, SDL_SWSURFACE | SDL_RESIZABLE); //what would that bitwise operator do
It creates a flag group containing the flags SDL_SWSURFACE and SDL_RESIZABLE.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top