『C程序设计』读书笔记系列文章之第十一章 位运算

1)概述

所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进制位的问题。

c提供的位运算符有:

& 按位与

| 按位或

^ 按位异或

~ 取反

<< 左移

>> 右移

&对于将一个单元清零、取一个数中的某些指定位以及保留指定位有很大用途。

|常被用来将一个数的某些位置1。

^判断两个位值,不同为1,相同为0。常用来使特定位翻转等。

~常用来配合其它位运算符使用的,常用来设置屏蔽字。

<<将一个数的各二进制位全部左移,高位左移后溢出,舍弃不起作用。左移一位相当于该数乘2,左移n位相当于乘2n。左移比乘法运算要快的多。

>>右移时,要注意符号问题。对无符号数,右移时左边高位移入0,对于有符号数,如果原来符号位为0(正数),则左边移入0;如果符号位为1(负数),则左边移入0还是1要取决于系统。移入0的称为”逻辑右移”,移入1的称为”算数右移”。

2)位段

将一个字节分为几段来存放几个信息。所谓位段是以位为单位定义长度的结构体类型中的成员。如:

struct packed-data{

unsigned a:2;

unsigned b:6;

unsigned c:4;

unsigned d:4;

int I;

}data;

其中a,b,c,d分别占2位,6位,4位,4位。I为整型,占4 个字节。

对于位段成员的引用如下:

data.a = 2;等,但要注意赋值时,不要超出位段定义的范围。如位段成员a定义为2位,最大值为3,即(11)2,所以data.a=5;就会取5的两个低位进行赋值,就得不到想要的值了。

关于位段的定义和引用,有几点重要说明:

①若某一个段要从另一个字开始存放,可以定义:

unsigned a:1;

unsigned b:2;

unsigned :0;

unsigned c:3; (另一单元)

使用长度为0的位段,作用就是使下一个位段从下一个存储单元开始存放。

②一个位段必须存放在用一个存储单元中,不能跨两个单元。

③可以定义无名位段。如:

unsigned a:1;

unsigned :2; (这两位空间不用)

unsigned b:3;

④位段的长度不能大于存储单元的长度,也不能定义位段数组。

    原文作者:loose_went
    原文地址: https://www.cnblogs.com/michaelxu/archive/2008/04/29/1176710.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞