How to initialize bitwise parameter ?

struct ParameterDef
{
   ....
   /* bit 0 indicates if the parameter is special or not.  It it's special read remaining bit(s)
       to find the specialty. */
   /* bit 0 -   special 1, not special 0
       bit 1 -   map modbus register value to whole number
       bits 2 - 15    -   reserved for future use
  */    
   unsigned short special_param_bits;
}

Open in new window


There is array of above structure.  

How to initialize special_param_bits variable with symbols instead of numbers ?
For special array entires, I want to indicate that the paramter is special and what specialty it has.  i.e. SPECIAL & MAP_MODBUS_REG
LVL 1
naseeamAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jkrCommented:
You already have it, the bitwise AND (&) will help you here

#define SPECIAL 1 // LSB == bit 0, or '1 << 0'
#define MAP_MODBUS_REG (1 << 5) // assuming it is bit 5
ParameterDef pd;

pd.special_param_bits = SPECIAL & MAP_MODBUS_REG;

Open in new window

kaufmed   ( ⚆ _ ⚆ )Patches? We Ain't Got No Patches! We Don't Need No Patches! I Don't Have to Push You No Stinkin' Patches!Commented:
Use the bitwise operators with the appropriate flags. In this case, to set it you will use bitwise OR if you have multiple things to set.

e.g.

const short FLAG_SPECIAL =    0x80000000;
const short FLAG_MAP_MODBUS = 0x40000000;

struct ParameterDef instance;
instance.special_param_bits = FLAG_SPECIAL | FLAG_MAP_MODBUS;

Open in new window


Each flag needs to be a power of 2 in its value, since each flag's value represents a bit position within the short. Speaking in bits, your flags look like this:

const short FLAG_SPECIAL =    1000 0000 0000 0000;
const short FLAG_MAP_MODBUS = 0100 0000 0000 0000;

Open in new window

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
kaufmed   ( ⚆ _ ⚆ )Patches? We Ain't Got No Patches! We Don't Need No Patches! I Don't Have to Push You No Stinkin' Patches!Commented:
For correctness, jkr's suggestion of bitwise AND is actually incorrect. AND is for querying if a bit has been set; OR is used for setting the bit. In other words, 1 & 0 == 0 whereas 1 | 0 == 1.
jkrCommented:
*Argh*, it of course has to be 'OR', this is embarassing ;o)
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Programming Languages-Other

From novice to tech pro — start learning today.