在C中,需要对内存的直接操作,得到汇编级的代码,就需要熟悉位运算。
首先,复习一下基本的东西。
1,补码:正值不变,负值是绝对值的表示按位取法再加1
2,一个字节是8位,这是固定的,但是一个字(word)却和系统有关,在32位字长的机器上,典型的情况是:
类型 长度(字节)
char 1
short 2
int 4
long 4
float 4
double 8
long double 16
3,进制:在代码中,0表示八进制,0x表示16进制
4,位运算
运算符 & | ^ ~ << >>
1,对一个整型变量进行的部分位操作
data=data & ~(15 << 4) | (n & 15) <<4
上例是对data的7-4位进行操作
2,位段
struct packed_data
{
unsigned a: 2;
unsigned b: 6;
unsigned c: 4;
unsigned d: 4;
int i;
}data;
|
1,位段允许的类型是unsigned (int), int, char
2,位段允许的最大长度为一个字,也相等于int长度
3,位段遵守对齐规则,具体见C/C++的对齐一文
4,位段并不能提高运行速度,因为CPU指令只能以字节操作;在对位段访问的时候,必然引起相应的开销(例如将某位用位运算取出,放到字节单位的临时存储中),所以反而会降低运行速度。
5,位段的成员可以当作int来运算。
阅读(1303) | 评论(0) | 转发(0) |