zoukankan      html  css  js  c++  java
  • 『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;
    ④位段的长度不能大于存储单元的长度,也不能定义位段数组。
  • 相关阅读:
    DM数据库disql的使用 Disql disql 达梦数据库Disql
    移动端禁止蒙层下的页面滚动
    移动端如何自动适配px
    使用Vant做移动端对图片预览ImagePreview和List的理解
    uniapp中使用uView组件库
    h5使用vuephotopreview 做全屏预览
    jsonview的实现
    PC端自适应使用rem 移动端适配升级版
    axios解决跨域问题(vuecli3.0)
    vs code 配置git path
  • 原文地址:https://www.cnblogs.com/michaelxu/p/1176710.html
Copyright © 2011-2022 走看看