#define by orders of two in a clean fashion

Started by
5 comments, last by Shannon Barber 18 years ago
I'm doing some stuff with bit operations in C++, and I need to #define constants by orders of two. For example, say I had a char variable representing financial packages for students at college. They can be on a meal plan, a housing plan, a parking space plan, and/or a financial aid plan. If I want to store whether they are on these plans, I might #define them like this:

#define ON_MEAL_PLAN 1
#define ON_HOUSING_PLAN 2
#define ON_PARKING_PLAN 4
#define ON_FINANCIAL_PLAN 8
I would really rather #define these by orders of two; this is really just kind of a code formatting issue... I want it to look nice :) Any ideas? If you don't understand me, just ask and I'll try to clarify.
my siteGenius is 1% inspiration and 99% perspiration
Advertisement
You mean something like this?
enum {  ON_MEAL_PLAN = 1,  ON_HOUSING_PLAN = 2 << 0,  ON_PARKING_PLAN = 2 << 1,  ON_FINANCIAL_PLAN = 2 << 2};

EDIT: Err, this may look a bit better:
enum {  ON_MEAL_PLAN = 1 << 0,  ON_HOUSING_PLAN = 1 << 1,  ON_PARKING_PLAN = 1 << 2,  ON_FINANCIAL_PLAN = 1 << 3};
Sure, I think that would work fine! Unless anyone else thinks of a nicer-looking way, I'll just go with that. Thanks.
my siteGenius is 1% inspiration and 99% perspiration
Quote:Original post by silverphyre673
I'm doing some stuff with bit operations in C++, and I need to #define constants by orders of two. For example, say I had a char variable representing financial packages for students at college. They can be on a meal plan, a housing plan, a parking space plan, and/or a financial aid plan. If I want to store whether they are on these plans, I might #define them like this:

#define ON_MEAL_PLAN 1#define ON_HOUSING_PLAN 2#define ON_PARKING_PLAN 4#define ON_FINANCIAL_PLAN 8


I would really rather #define these by orders of two; this is really just kind of a code formatting issue... I want it to look nice :) Any ideas? If you don't understand me, just ask and I'll try to clarify.


One relatively common thing is to bit shift each one
#define ON_MEAL_PLAN      (1<<0)#define ON_HOUSING_PLAN   (1<<1)#define ON_PARKING_PLAN   (1<<2)#define ON_FINANCIAL_PLAN (1<<3)
The other method I see a lot is to just do what you have above
#define ON_MEAL_PLAN 1#define ON_HOUSING_PLAN 2#define ON_PARKING_PLAN 4#define ON_FINANCIAL_PLAN 8
You might want to consider an enum if you don't need them in the preprocessor. I'm not too familiar with bit fields, but if your implmentation packs them well (I don't know how common that is), then that may be an option as well.
OK. Yeah, this is a total formatting issue, so I think the enumeration bit-shifting technique will work fine. I remember seeing this somewhere months ago online, but I'd forgotten. Thanks, all!
my siteGenius is 1% inspiration and 99% perspiration
you could always just make a set of standard defs
#define BIT1 (1<<0)
#define BIT2 (1<<1)
...

or
#define BIT(x) (1<<x)

and then just do
#define ON_MEAL_PLAN BIT(1)
#define ON_HOUSING_PLAN BIT(2)
...
You usually see it as hex

enum MyEnum {
A = 0x01,
B = 0x02,
C = 0x04,
D = 0x08,
E = 0x10,
F = 0x20,
G = 0x40,
H = 0x80,
I = 0x100
}

Or bit-fields might be what you really want:

struct Stuff {
uint32 MealPlan :1;
uint32 HousingPlan :1;
uint32 ParkingPlan :1;
uint32 FinancialPlan :1;
};

unsigned bit-fields are technically non-standard, but I never see signed bit-fields in code.
- The trade-off between price and quality does not exist in Japan. Rather, the idea that high quality brings on cost reduction is widely accepted.-- Tajima & Matsubara

This topic is closed to new replies.

Advertisement