一、进制基础知识

  1、通常,1字节(Byte)包含8位(bit)。C语言用字节表示储存系统字符集所需的大小。

  2、对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位,第几位表示2的指数大小。

  3、1字节(8位)可存储256个值,unsigned char用1字节表示的范围是0-255,signed char用1字节表示的范围是(-128)-(+127)。

  4、每个8进制位对应3个二进制位,每个16进制位对应4个二进制位。

  5、补码反码等与有符号整数有关的部分省略。

二、C操控位工具(2)——按位运算符

  注意:按位运算符操作的位不会改变其它位。

        逻辑运算符的优先级低于算数运算符。

  1、按位逻辑运算符 ~ & | ^

  1.1、二进制按位取反运算符~

     简单来说就是每一位都取相反数,1变成0,0变成1,规则如下:

     (~1) = 0,(~0) = 1

     示例如下:

    ~()    //结果为01100101,每一位都取相反数

  1.2、二进制按位与运算符&

     简单来说全为1则结果为1,不全为1或者全不为1则结果为0,规则如下:

     1 & 1 = 1,1 & 0 = 0, 0 & 0 = 0,结果操作位在运算符左右位置无关

     示例如下:

    () & ()    //结果为00000001,只有最后一位全为1  

  1.3、二进制按位或运算符|

     简单来说就是有1(全为1或者不全为1)则结果为1,全不为1(全为0)则结果为0,规则如下:

     1 | 1 = 1,1 | 0 = 1, 0 | 0 = 0,结果操作位在运算符左右位置无关

     示例如下:

    () | ()    //结果为11111110,只有最后一位全为0

  1.4、二进制按位异或运算符^

     简单来说就是操作位数值相同(全为0或者全为1)为0,相反(一个0一个1)为1,规则如下:

     1 ^ 1 = 0,1 ^ 0 = 1, 0 ^ 0 = 0,结果操作位在运算符左右位置无关

     示例如下:

   () ^ ()    //结果为11111100,最第为全为0,第二位全为1,其它位均相反

  1.5、应用

    根据按位逻辑运算符可进行 打开位(设置位)关闭位(清空位)切换位检查位的值等操作。

  2、移位运算符

     注意:移位运算符向左或者向右移位,被移出的位直接丢弃,移进的位补0。

  2.1、左移运算符<<

    示例如下:   

     ()  <<      //结果为00101000

  2.2、右移运算符>>

    示例如下:

     ()  >>     //结果为00100010

  2.3、应用

      针对2的幂可快速进行有效的乘法和除法,类似十进制中移动小数点来乘以或除以10,如下所示:

    number << n        //表示number乘以2的n次幂
    number >> n //若number非负,则用number除以2的n次幂

三、C操控位工具(2)——位字段

  1、位字段简介

        位字段是一个signed int或者unsigned int类型变量中的一组相邻的位,需通过一个结构体声明来建立,该结构为每个字段提供标签,并确定该字段的宽度。如下所示:

  /* 定义一个包含4个成员变量的结构体prnt,每个成员的位宽为1 */  
  struct{
  unsigned int autfd : ;
  unsigned int bldfc : ;
  unsigned int undln : ;
  unsigned int itals : ;
  }prnt;
    
  /* 为结构体成员赋值 */
  prnt.itals = ;
  prnt.undln = ;    /* 定义一个包含2个成员变量的结构体prcode,成员变量位宽不一 */  
struct{
unsigned int code1 : ;
unsigned int code2 : ;
}prcode; /* 为结构体成员赋值 */
prcode.code1 = ; /**< code1最大可赋值3 */
prcode.code1 = ; /**< 赋值范围在0-255中均可 */

   变量prnt会prcode被储存在int大小的内存单元中。

  2、声明的总位数超过范围的解决方法

    如果声明的总位数超过一个unsigned int类型的大小,则会用到下一个unsigned int类型的存储位置。一个字段不允许跨越两个unsigned int之间的边界。编译器会自动移动跨界的字段,保持

unsigned int的边界对齐。一旦发生这种情况,第一个unsigned int 中会保留一个未命名的"洞",可用此未命名的洞来填充超过的位数。如下所示:

  struct{
  unsigned int field1 : ;
  unsigned int : ; /**< 填补field1的"洞" */
  unsigned int field2 : ;
  unsigned int : ; /**< 填补field2的"洞" */
unsigned int field3 : ; /**< 填补field3的"洞"并未给出 */
  }stuff;

  位字段在unsigned int中存储的位置根据机器而定,有些从右往左顺序存储,有些则从左往右,由于这些原因位字段通常都不容易移植。

C语言基础知识(四)——位操作的更多相关文章

  1. Go语言核心36讲(Go语言基础知识四)--学习笔记

    04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...

  2. C语言基础知识-数据类型

    C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...

  3. OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  4. 李洪强iOS开发之OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  5. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  6. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

  7. C语言基础知识-运算符与表达式

    C语言基础知识-运算符与表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用运算符分类 1>.算术运算符 用于处理四则运算. 2>.赋值运算符 用于将表达式的 ...

  8. Java语言基础(四)

    Java语言基础(四) 一.基本数据类型(8) byte  8位  使用较少,一般用于网络传输: -128-+127 short  16位 不常用 -32768-+32767 int  32位 常用  ...

  9. Golang 入门系列(三)Go语言基础知识汇总

    前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...

随机推荐

  1. Android 项目 Android 学习手册(一)

    前言: 当每次查询android 知识的时候,内心是凌乱的,总觉得要是有一个工具多好, 尤其在手机端如何可以查询的话,会非常完美,能大大减少选择查询的时间, 之前见了很多java 学习手册,把一些重要 ...

  2. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

  3. STL--priority_queue--自定义数据类型

    STL中priority_queue的声明模板有3个参数priority_queue<Type,Container,Functional>. 当使用的数据类型Type为自定义数据类型时有以 ...

  4. 8种MySQL分页方法总结

    这篇文章主要介绍了8种MySQL分页方法总结,小编现在才知道,MySQL分页竟然有8种实现方法,本文就一一讲解了这些方法,需要的朋友可以参考下 MySQL的分页似乎一直是个问题,有什么优化方法吗?网上 ...

  5. Nginx模块开发(1)————类helloworld

    Nginx看了一点了,准备写个helloworld试试,觉得只看书的话很多东西都乱乱的,晕晕的,印象不深. 我的helloworld模块的目的就是:能够在浏览器里输入http://你的ip地址/lcw ...

  6. andorid jar/库源码解析之retrofit2

    目录:andorid jar/库源码解析 Retrofit2: 作用: 通过封装okhttp库,来进行web通讯,并且使用动态代理的方式,来调用接口地址,通过回调赋值结果. 栗子: 定义一个接口,用于 ...

  7. C. Game with Chips(陷阱暴力题)

    \(为什么说这是个陷阱呢??\) \(因为不管你脑洞多大,数学多好,都发现会束手无策\) \(每移动一次不知道往哪个方向,不知道先访问哪个点,同时要记录所有点的坐标,记录每个点是否访问过目标点.... ...

  8. Three Blocks Palindrome (easy version)[暴力-预处理]

    给定一个数组,找出最长的子序列,满足 a,a,..a,b,b,..b,a,a,..a 前面的a和后面的a都要是x个,中间的b是y个. 其中,x>=0且y>=0. \(\color{Red} ...

  9. 如何发挥Visual Studio 2019强大的编辑功能轻松编辑Keil项目

    本文地址:https://www.cnblogs.com/jqdy/p/12565161.html 习惯了VS的强大编辑功能,对Keil 5越来越深恶痛绝.查阅网络文章后按图索骥初步实现了VS编辑Ke ...

  10. RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群

    RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/128371 ...