01--按位与运算 &
& 是双目运算符,& 左右参与运算的数各对应的二进制位相与,只有当对应位都为1时,运算后结果为1,否则为0。
例15&3
00001111&00000011 = 00000011 即15&3=3
按位与通常用来对某些位清0或保留某些位,例如把一个数高8位清0而保留低8位:
C&255
02--按位或运算 |
| 是双目运算符,| 左右参与运算的数各对应的二进制位相或,只要对应位有一个为1时,运算后结果为1,否则为0。
例15&3
00001111|00000011 = 00001111 即15|3=15
03--按位异或运算 ^
^ 是双目运算符,^ 左右参与运算的数各对应的二进制位相异或,当两对应的二进位相异时,运算后结果为1,否则为0。
例15^3
00001111^00000011 = 00001100 即15^3=12
04--求反运算符 ~
求反运算符 ~ 为单目运算符,具有右结合性。其功能是对参与运算的数的各二进制位进行按位求反
~15
~(00001111)= 00000000
05--左移运算符 <<
左移运算符<<是双目运算符,其功能是把<<左边的运算数左移<<右边的指定移动的位数,高位丢弃,低位补0。
当a=15,a<<3
00001111 << 3 即01111000 120
06--右移运算符 >>
右移运算符>>是双目运算符,其功能是把>>左边的运算数右移>>右边的指定移动的位数
当a=15,a>>3
00001111 >> 3 即00000001 1
对于有符号数,在右移时,符号位将随同移动。当为整数时,最高位补0,当为负数时,符号位为1,其最高位补0或者1由编译系统决定
07--位域(位段)
为了节省空间,C语言还提供了一种数据结构,称为位域或位段。
位域是把一个字节中的二进位划分为不同的几个区域,并说明每个区域的位数。每个域都有一个域名,允许程序中按域名操作。
位域定义与结构体的定义比较类似,其形式为:
struct 位域结构名
{位域列表};
其中位域列表的形式为:
类型说明符 位域名:位域长度
例如:
struct data
{
int a:3;
int b:5;
int c:8;
}Num;
Num 是data的变量,共占用2个字节,其中位域a占用3位,位域b占用5位,位域c占用8位。
对于位域有以下说明:
1.一个位域必须存储在一个字节当中,不允许跨字节存储。当一个字节剩下的区域不足够放另一个位域时,应从下一个字节起存放该单元
2.由于不能跨字节存放位域,因此一个位域的最大长度不能超过一个字节即8位
3.位域可以无位域名
位域的使用:
位域的使用形式:
位域变量名.位域名
#include"stdio.h"
int main()
{
struct data
{
int a:1;
int b:3;
int c:4;
}num;
num.a=1;
num.b=7;
num.c=15;
printf("%d,%d,%d\n",num.a,num.b,num.c);
return 0;
}