c语言中的位字段

c语言中的位字段

比如我们想写一个这样的程序,标识一个会员的身份和服务,是否是高级会员,是否有发信服务,是否有邀请其他人权限
我们可以将这些“开关”放在一个字段里,那就是“位”的概念,每一位有两个值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;

	// 
}

定义与其他结构类似,只不过多了一个冒号,引用方式也与结构相同。
上面这种方法可以直接访问一个“字”中的位字段,位字段是字中相邻位的集合。
注:字是单个的存储单元,它与具体的实现有关

你可能感兴趣的:(C语言)