位操作

掩码
10110101
&
11111100
101101XX


打开第三位
10110101
|
00100000
10110101


关闭第三位
10110101
&
11011111
10010101

 

转置前4位
10110101
^
11110000
01000101

 

查看一位的值

if ((flag & MASK) ==  MASK)

== 则为"1"

!= 则为"0"

 

 

在字节中,位7称为高位(high-order bit),位0称为低位(low-order bit)。

 

按位取反、位与、位或、位异或

掩码、打开位、关闭位、位转置、查看某一位值

左移、右移

位操作不改变原操作数的值,需要将表达式赋值给变量

 

 

 右移位运算符>>将其左侧操作数的值的每位向右移动,移动的位数由其右侧操作数指定。丢弃移出左侧操作数右端的位。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器。空出的位可能用0填充,或者使用符号(最左端的)位的副本填充:

 

位字段

 1     struct Color
 2     {
 3         int red : 8;
 4         int green : 8;
 5         int blue : 8;
 6     } frontColor;
 7     
 8     frontColor.red = 100;
 9     frontColor.green = 300;
10     frontColor.blue = 300;
11 
12     printf("%d\n", frontColor.red);
13     printf("%d\n", frontColor.green);
14     printf("%d\n", frontColor.blue);
15 
16     printf("%d\n", frontColor);

 如果你声明的总位数超过一个unsigned int 大小, 那将会使用下一个unsigned int 存储位置。不允许一个字段跨越两个unsigned int 之间的边界。编译器自动的移位一个这样的字段定义,使字段按unsigned int边界对齐。发生这种情况时,会在第一个unsigned int 中留下一个未命名的洞。您可以使用未命名的字段宽度"填充"未命名的洞。使用一个宽度0的未命名的字段迫使下一个字段与下一个整数对齐:

 1     struct Color
 2     {
 3         int red : 1;
 4         int  : 3;    // 留出3位的空隙
 5         int green : 3;
 6         int  : 0;    // 强制对齐到下一个int
 7         int blue : 32;
 8         int : 0;   
 9     } frontColor;
10     
11     printf("%lu\n", sizeof(frontColor));    // 占用2个int长度

 

posted @ 2014-07-30 14:03  挨踢淫才  阅读(362)  评论(0编辑  收藏  举报