• 『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;
    ④位段的长度不能大于存储单元的长度,也不能定义位段数组。
  • 相关阅读:
    [转贴]Asp.Net[C#]在线压缩解压
    [转载]如何用C#语言构造蜘蛛程序
    [转载].net 集合类初步认识
    试用随笔
    安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
    关于IE提示“Internet Explorer无法打开站点,已终止操作”的解决办法
    linux每天建立一个以当天日期命名的文件夹
    linux常用装机命令
    linux安装oracle客户端
    批量分发文件
  • 原文地址:https://www.cnblogs.com/michaelxu/p/1176710.html
Copyright © 2020-2023  润新知