C语言基础知识(四)——位操作
一、进制基础知识
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语言基础知识(四)——位操作的更多相关文章
- Go语言核心36讲(Go语言基础知识四)--学习笔记
04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...
- C语言基础知识-数据类型
C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...
- OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
- C语言基础知识-数组和字符串
C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...
- C语言基础知识-程序流程结构
C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...
- C语言基础知识-运算符与表达式
C语言基础知识-运算符与表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用运算符分类 1>.算术运算符 用于处理四则运算. 2>.赋值运算符 用于将表达式的 ...
- Java语言基础(四)
Java语言基础(四) 一.基本数据类型(8) byte 8位 使用较少,一般用于网络传输: -128-+127 short 16位 不常用 -32768-+32767 int 32位 常用 ...
- Golang 入门系列(三)Go语言基础知识汇总
前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...
随机推荐
- (数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)
本文示例代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在前面的基于geopandas的空间数据分 ...
- Spark 源码系列(六)Shuffle 的过程解析
Spark 大会上,所有的演讲嘉宾都认为 shuffle 是最影响性能的地方,但是又无可奈何.之前去百度面试 hadoop 的时候,也被问到了这个问题,直接回答了不知道. 这篇文章主要是沿着下面几个问 ...
- 业务SQL那些事--慎用LIMIT
业务SQL那些事--慎用LIMIT 在业务中使用LIMIT限制SQL返回行数是很常见的事情,但如果不知道其中可能的坑或者说真正执行逻辑,就可能会使SQL执行非常慢,严重影响性能. LIMIT OFFS ...
- 运用shell脚本 执行sftp,ftp命令
sftp文件上传(从本地上传到远程) #!/bin/bash #远程上传文件测试 if [ $# -ne 2 ] then echo "miss arguments" echo & ...
- INTERVIEW #3
菊厂的面试本来没打算记录,因为当时投的是非技术岗(技术支持).为了全面,就寥做记录. 菊厂的面试因为有口头保密协议,所以不能透露具体题目. 0 群面 简历通过筛选后,会有短信通知去面试. 非技术岗第一 ...
- Leetcode 1. 两数之和 (Python版)
有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...
- csp-j2019游记
我一pj蒟蒻这点水平还来写游记? 算了,毕竟是第一次,记录一下吧 noip->csp 话说我跟竞赛是不是天生八字不合啊...... 小学的时候学小奥,等我开始报名比赛,当时似乎所有竞赛都被叫停了 ...
- 经过踩坑,搭建成功的Appium自动化测试环境
因为最近本人准备搞app自动化,所以就搭建环境过程记录下来(主要踩过好几个坑) 期间有点烦躁,后面调整了下心态还是成功弄好了. 一.Appium环境搭建准备软件 所需要到的软件如下: 1.安装JDK1 ...
- SSM框架完整开发流程
----------------第一阶段-------------- 1.数据库建模 2.生成sql语句 3.在mysq客户端使用命令方式执行sql脚本,生成数据库 4.允许远程访问mysql GRA ...
- 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库
支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...