位操作
掩码
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长度