赞
踩
位运算,就是对一个比特(Bit)位进行操作;
C语言提供了六种位运算符:
除了取反运算符,其余均为双目运算符;
运算量只能是整型或者字符型数据,不能为实型数据;
作用:
1、按位与运算通常用来对某些位清 0,或者保留某些位;
例如要把 n 的高 16 位清 0 ,保留低 16 位,可以进行n & 0XFFFF运算(0XFFFF 在内存中的存储形式为 0000 0000 – 0000 0000 – 1111 1111 – 1111 1111)。
2、取一个数中的某些位;
3、要想将哪一位保留下来,就与一个数进行&运算,次数在该位取1;
作用:
1、按位或运算可以用来将某些位置 1,或者保留某些位;
参与^运算两个二进制位不同时,结果为 1,相同时结果为 0(不同为1)
作用:
1、按位异或运算可以用来将某些二进制位反转;
例如要把 n 的高 16 位反转,保留低 16 位,可以进行n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 – 1111 1111 – 0000 0000 – 0000 0000)。
2、与0进行异或保留原值;
3、交换两个值,不用临时变量;
取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。
左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0
如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方
算术左移和逻辑左移一样都是右边补0
右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。
如果无符号数,补0;
有符号数可能补1,也可能补0,若最高位为0,则补0,若最高位为1,则可能补0也可能补1,由系统决定,分为两种情况:
1、算数右移
补1,即带着符号位一起右移
2、逻辑右移
补0
如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。
比如:a为short , b为int
系统会将二者按右端对齐,如果a为正数,则左侧16位补满0;若a为负数,左端应补满1;如果a为无符号整数型,则左端填满0;
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段或位域,如下:
struct bs{
unsigned m;
unsigned n: 4; //占4bit
unsigned char ch: 6; //占6bit
}
C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。
C语言标准规定,只有有限的几种数据类型可以用于位域。在 ANSI C 中,这几种数据类型是 int、signed int 和 unsigned int(int 默认就是 signed int);到了 C99,_Bool 也被支持了。
位段要从另一个存储单元开始,可以用如下形式:
int a:1;
int b:2;
int 0; //本存储单元不再存放数据
int c:3 //在另一存储单元存放
上述 int 0;为一个无名位段,无名位域一般用来作填充或者调整成员位置。因为没有名称,无名位域不能使用。
位域有利于减少存储空间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。