Chinaunix首页 | 论坛 | 博客
  • 博客访问: 511964
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: C/C++

2009-03-09 12:50:25

在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来运算。
阅读(1297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~