c语言标志位设置原理

⌚Time: 2022-09-13 00:21:01

👨‍💻Author: Jack Ge

标志位可以代表某些属性,如MFC窗体的标志位,代表是否有最大化按钮,是否有边框,是否是子窗体等

对于一个4字节的int数,有32位长度

00000000 00000000 00000000 00000000

可以通过将这些位置0或者1实现标志位设置。

对于位操作,就少不了位运算符|或、&与、^异或、~取反


定义标志位

如果想将从0开始第3位作为具有含义的标志位

00000000 00000000 00000000 00001000

对应的值为0x08,可以定义一个标志


#define FLAG_AAA 0x08

设置标志位

定义一个变量arrtibute


int arrtibute = 0;

给flag设置此标志位,使用|运算符,可以使特定位置1,这样arrtibute的第3位就成为了1


arrtibute = arrtibute|FLAG_AAA;

00000000 00000000 00000000 00001000


取消标志位

给arrtibute取消标志位,使用&运算符

arrtibute只需要与

11111111 11111111 11111111 11110111

即0xFFFFFFF7做与运算,就可以使第3位置0,而0xFFFFFFF7数值,实际上可以通过FLAG_AAA取反得到


arrtibute = arrtibute&(~FLAG_AAA);

查询标志位

通过变量与FLAG_AAA做与运算,如果标志位是1,与运算的结果就是1,如果标志位是0,与运算结果就是0


if(arrtibute&FLAG_AAA){

        puts("has FLAG_AAA yes");

}else{

        puts("has FLAG_AAA no");

}

反转标志位

如果原本具有此标志,想取消此标志,或者原来没有此标志,想设置此标志,通过^异或运算符实现。标志位与1进行异或运算,则该位的1将变成0,0变成1,而其它位与0做异或运算,数值不会改变


arrtibute = arrtibute^FLAG_AAA ;