Jump to content
  • Advertisement
Sign in to follow this  
Aluthreney

a simple question regarding a variable definition

This topic is 1848 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I was looking up some stuff on bullet physics (here:Bullet Physics - Collision Filtering) and I found a peculiar variable definition on the last line:

#define BIT(x) (1<<(x))
enum collisiontypes {
    COL_NOTHING = 0, //<Collide with nothing
    COL_SHIP = BIT(0), //<Collide with ships
    COL_WALL = BIT(1), //<Collide with walls
    COL_POWERUP = BIT(2) //<Collide with powerups
}

int shipCollidesWith = COL_WALL;
int wallCollidesWith = COL_NOTHING;
int powerupCollidesWith = COL_SHIP | COL_WALL; <---- THIS LINE HERE!

What is this kind of definition is this and what is it usually used for?

Share this post


Link to post
Share on other sites
Advertisement

It's bitwise (logical) or. So it is

 

BIT(0) | BIT(1) = (1<<0) | (1<<1) = 1 | 2 = 3

 

i.e. bits 0 and 1 set. Since the bits are distinct, + would work just as well as |, but with | the intent is clear (a power up collides with either a ship or a wall or both).

Share this post


Link to post
Share on other sites

It's bitwise (logical) or. So it is

 

BIT(0) | BIT(1) = (1<<0) | (1<<1) = 1 | 2 = 3

 

i.e. bits 0 and 1 set. Since the bits are distinct, + would work just as well as |, but with | the intent is clear (a power up collides with either a ship or a wall or both).

I understand the idea, but I don't see what the part that I put in bold is for. I know it has something to do with bitwise operations, but I don't understand it in this context. Thank you for your reply.

Edited by Aluthreney

Share this post


Link to post
Share on other sites

It's logical shift left, which multiplies the left operand by 2N (where N is the right hand operand).

 

A left shift applied to the number 1 (just 1 bit set, the least significant bit, or "bit 0" as it is commonly called, so the bits in a 32-bit wide integer are bits 0 to 31, 31 being the most significant bit), sets the nth bit in the integer.

 

1 << 0 = 1 = 1 in binary

1 << 1 = 2 = 10 in binary

1 << 3 = 4 = 100 in binary

1 << 4 = 8 = 1000 in binary

1 << 5 = 16 = 10000 in binary

 

etc.

 

If you think about this in binary, you will see what is going on.

 

EDIT: So it is a way of packing up to 32 boolean values into a 32 bit integer (or 16 in a short, 64 in a 64 bit int, etc.).

Edited by Paradigm Shifter

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!