移位运算符和移位表达式在C中,移位运算符是指将位“左移”或“右移”。它们的操作数都应是整型量。由移位运算符和左右操作数构成的表达式称为移位表达式。(1)左移运算符<<左移运算符<<是双目运算符,运算规则是:将左侧操作数的值每位向左移动,移动的位数由右侧操作数决定。左侧移出的位被丢弃掉,右侧空出的位填充0。(2)右移运算符>>右移运算符>>是双目运算符,运算规则是:将左侧操作数的值每位向右移动,移动的位数由右侧操作数决定。右侧移出的位被丢弃掉。对于unsigned类型,左侧空出的位填充0,对于有符号数,左侧空出的位依赖于机器,有些直接填充0,有些填充符号位
移位运算符和移位表达式 在C中,移位运算符是指将位“左移”或“右移”。它们 的操作数都应是整型量。由移位运算符和左右操作数构成的表 达式称为移位表达式。 (1)左移运算符<< 左移运算符<<是双目运算符,运算规则是:将左侧操作数的值 每位向左移动,移动的位数由右侧操作数决定。左侧移出的位 被丢弃掉,右侧空出的位填充0。 (2)右移运算符>> 右移运算符>>是双目运算符,运算规则是:将左侧操作数的值 每位向右移动,移动的位数由右侧操作数决定。右侧移出的位 被丢弃掉。对于unsigned类型,左侧空出的位填充0,对于有符 号数,左侧空出的位依赖于机器,有些直接填充0,有些填充符 号位
移位运算符的优先级和结合性两个移位运算符的优先级别相同,而且高于关系运算符低于算术运算符,当然也高于位运算符。其结合性为从左至右。①移位运算符能够快速、高效的对2的幂做乘法或除法运算。inti=64;//26=64,64的补码为01000000/右移2位后为00010000,表达式值为16i>> 2;i<<1;1/左移1位后为10000000,(10000000)2=(128)10移位运算比乘法或除法运算快很多,如果移位位数大于左操作数的位宽,则结果因编译器的不同而不同。②移位运算符的操作数都应是整型量,使用浮点数,编译器将会报错。③同样,移位运算不改变操作数本身的值
移位运算符的优先级和结合性 两个移位运算符的优先级别相同,而且高于关系运算符, 低于算术运算符,当然也高于位运算符。其结合性为从左至右。 ① 移位运算符能够快速、高效的对2的幂做乘法或除法运算。 int i = 64; // 26=64,64的补码为0100 0000 i >> 2; //右移2位后为0001 0000,表达式值为16 i << 1; //左移1位后为1000 0000,(1000 0000)2=(128)10 移位运算比乘法或除法运算快很多,如果移位位数大于左 操作数的位宽,则结果因编译器的不同而不同。 ② 移位运算符的操作数都应是整型量,使用浮点数,编译器将 会报错。 ③ 同样,移位运算不改变操作数本身的值
位域9.2计算机语言中的数据通常是以字节为单位表示的。但在实际应用中,某些信息仅仅需要若干二进制位(bit)来表示。如逻辑变量的值(0或1)用一位二进制位就可表示:四个班级的编号信息(1、2、3、4)用两位二进制位就可表示学生的学号信息用若干位表示等。虽然用字节和按位运算符可以实现对这些信息的存储和访问,但C语言为了更有效地解决这类问题,允许定义具有可变长度位的结构成员。这种成员称为位域。它是整型数存储区中相连的位的集合。通过位域可以方便地用成员名访问小于一个字节的存储区。它不仅可以节省存储空间,而且对外部设备工作状态的监控及按位传递信息的处理都是很有用处的
9.2 位域 计算机语言中的数据通常是以字节为单位表示的。但在 实际应用中,某些信息仅仅需要若干二进制位(bit)来表 示。如逻辑变量的值(0或1)用一位二进制位就可表示;四 个班级的编号信息(1、2、3、4)用两位二进制位就可表示; 学生的学号信息用若干位表示等。虽然用字节和按位运算符 可以实现对这些信息的存储和访问,但C语言为了更有效地 解决这类问题,允许定义具有可变长度位的结构成员。这种 成员称为位域。它是整型数存储区中相连的位的集合。通过 位域可以方便地用成员名访问小于一个字节的存储区。它不 仅可以节省存储空间,而且对外部设备工作状态的监控及按 位传递信息的处理都是很有用处的
位域的定义定义包含位域成员的结构类型的语句如下:struct类型名类型变量名1:长度;类型变量名2:长度:类型变量名n:长度;子由上面的语句可见,位域是结构成员的特殊形式,它需要定义位的长度。位域定义的一般形式是:类型变量名:长度:其中,冒号“:”表示使用的是位域,其后的长度表示需要分配的存储单元的位数。域变量必须定义为int或unsigned
位域的定义 定义包含位域成员的结构类型的语句如下: struct 类型名 { 类型 变量名1:长度; 类型 变量名2:长度; . 类型 变量名n:长度; } 由上面的语句可见,位域是结构成员的特殊形式,它需要定义位的长 度。位域定义的一般形式是: 类型 变量名:长度; 其中,冒号“:”表示使用的是位域,其后的长度表示需要分配的存储单 元的位数。域变量必须定义为int或unsigned
位域定义示例structHunsignedbitO:1;unsigned bitl :I;unsigned bit2 :1;unsigned bit3:1;1个字节unsigned bit4:1;7位+6位+5位+2位+1位+0位+4位-3位bit7+bit6+bit5+ bit4bit3+ bit2×bitl bito+unsignedbit5:l;unsignedbit6:1;unsignedbit7:1;bits;这个结构定义了8个成员变量,每个变量只有一位。实际上这8个连续的变量表示了一个字节中的8位
位域定义示例 struct { unsigned bitO : 1; unsigned bit1 : 1; unsigned bit2 : 1; unsigned bit3 : 1; unsigned bit4 : 1; unsigned bit5 : 1; unsigned bit6 : 1; unsigned bit7 : 1; }bits; 这个结构定义了8个成员变量,每个变量只有一位。实际上这8个连续 的变量表示了一个字节中的8位