[b]c语言中的位字段[/b]
比如我们想写一个这样的程序,标识一个会员的身份和服务,是否是高级会员,是否有发信服务,是否有邀请其他人权限
我们可以将这些“开关”放在一个字段里,那就是“位”的概念,每一位有两个值0和1,来表示开与关
我们可以这样写:
当然也可以用枚举:
还有更高级的用法,就是标题上说的“位字段”,写法如下:
定义与其他结构类似,只不过多了一个冒号,引用方式也与结构相同。
上面这种方法可以直接访问一个“字”中的位字段,位字段是字中相邻位的集合。
[i]注:字是单个的存储单元,它与具体的实现有关[/i]
比如我们想写一个这样的程序,标识一个会员的身份和服务,是否是高级会员,是否有发信服务,是否有邀请其他人权限
我们可以将这些“开关”放在一个字段里,那就是“位”的概念,每一位有两个值0和1,来表示开与关
我们可以这样写:
#define HIGHLEVEL 01
#define SENDMAIL 02
#define INVITE 04
main(){
// 不具有任何权限的会员
int flags = 0;
// 具有高级会员
flags |= HIGHLEVEL;
// 具有三个权限
flags |= HIGHLEVEL | SENDMAIL | INVITE;
// 去掉高级会员和发信权限
flags &= ~(HIGHLEVEL | SENDMAIL);
// ...
}
当然也可以用枚举:
enum {HIGHLEVEL=01,SENDMAIL=02,INVITE=04};
...
还有更高级的用法,就是标题上说的“位字段”,写法如下:
struct {
unsigned int is_highLevel:1;
unsigned int can_sendMail:1;
unsigned int can_invite:1;
}flags;
//上面定义了一个flags变量,有三个字段,冒号后的数字表示字段的宽度(二进制位数)。
main(){
// 不具有任何权限的会员
flags.is_highLevel = flags.can_sendMail = flags.can_invite = 0;
// 具有高级会员
flags.is_highLevel = 1;
// 具有三个权限
flags.can_sendMail = flags.can_invite =1;
// 去掉高级会员和发信权限
flags.is_highLevel = flags.can_sendMail =0;
//
}
定义与其他结构类似,只不过多了一个冒号,引用方式也与结构相同。
上面这种方法可以直接访问一个“字”中的位字段,位字段是字中相邻位的集合。
[i]注:字是单个的存储单元,它与具体的实现有关[/i]