位定义,用于判断是否包含某属性
很多时候,对象有很多属性,我们可以增删对象的属性的支持,这时候,位定义是比较好解决问题的。
以windows窗口为例,窗口属性WS_OVERLAPPED,WS_BORDER,WS_DLGFRAME,WS_VSCROLL,WS_HSCROLL等等。
我们想加上WS_VSCROLL属性的常用写法
DOWRD ws_old = GetWindowLongA(hWnd,GWL_STYLE); //获取目前属性
ws_old |=WS_VSCROLL;
或者去掉WS_VSCROLL属性
ws_old &=~WS_VSCROLL;
判断时候具有WS_VSCROLL属性
if(ws_old & WS_VSCROLL)
用起来十分方便,那么如何进行位定义呢?
方法一:用enum
enum class WINDOW_STYLE: char //大小可以按照需求更改
{
WS_BASE=1,
WS_OVERLAPPED=WS_BASE<<1,
WS_BORDER= WS_BASE<<2,
WS_DLGFRAME= WS_BASE<<3,
WS_VSCROLL= WS_BASE<<4,
WS_HSCROLL= WS_BASE<<5
}
优点:类型保护,调试更清楚
缺点:无法直接进行位操作。
2、用define
#define WS_BASE 1
#define WS_OVERLAPPED (WS_BASE<<1)
#define WS_BORDER (WS_BASE<<2)
#define WS_DLGFRAME (WS_BASE<<3)
#define WS_VSCROLL (WS_BASE<<4)
#define WS_HSCROLL (WS_BASE<<5)
优点:可以直接进行位运算
缺点:移位操作符的优先级很低,必须加括号保护
3、用define与16进制
#define WS_BASE 1
#define WS_OVERLAPPED 2
#define WS_BORDER 4
#define WS_DLGFRAME 8
#define WS_VSCROLL 0x10
#define WS_HSCROLL 0x20
优点:可以直接进行位运算
缺点:排列不整齐,可以稍微改进下
#define WS_BASE 0x0001
#define WS_OVERLAPPED 0x0002
#define WS_BORDER 0x0004
#define WS_DLGFRAME 0x0008
#define WS_VSCROLL 0x0010
#define WS_HSCROLL 0x0020
是不是舒服很多。。。 附windows的定义