C Primer Plus 学习笔记 第15章 位操作

其实后三章的内容不重要了,其中第十六章可以看一看。这一章基本可以跳过了。

全书共分17章,这是关于本书第15章内容的博客。本章主要介绍了关于位操作的内容。这一篇博客简单写写就过了。博客的目录和书上目录是相似的。此系列博客的代码都在Visual Studio 2022环境下编译运行。 

我目前大一刚刚结束,水平有限,博客中若有错误或者总结不到位的地方也请见谅。

目录

15.1 二进制数、位和字节

15.1.1 二进制整数

15.1.2 有符号整数

15.1.3 二进制浮点数

15.2 其他进制数

15.2.1 八进制

15.2.2 十六进制

15.3 C按位运算符

15.3.1 按位逻辑运算符

15.3.2 用法:掩码

15.3.3 用法:打开位(设置位)

15.3.4 用法:关闭位(清空位)

15.3.5 用法:切换位

15.3.6 用法:检查位的值

15.3.7 移位运算符

15.4 位字段

15.5 对齐特性(C11)


15.1 二进制数、位和字节

通常使用十进制来书写数字,计算机使用二进制。二进制的数字是0和1的组合,计算机通过关闭和打开的组合表示信息,这样很方便。

15.1.1 二进制整数

C语言用字节表示存储系统字符集需要的大小,通常是8位。描述存储器芯片和数据传输率中的字节是八位字节。

15.1.2 有符号整数

二进制原码的最高位是符号位(正数为0,负数为1),后面的位是整数的绝对值的二进制表示。

正数的二进制反码和原码一样。负数的二进制反码是原码的符号位不变,其余位按位取反(1变0,0变1)。

正数的补码和原码、反码一样。负数的二进制补码是反码+1,计算机通常使用二进制补码存储整数。

15.1.3 二进制浮点数

小数也可以用二进制表示,但是许多分数不能用二进制准确地表示。计算机多使用IEEE 754标准存储浮点数。

15.2 其他进制数

计算机界多使用八进制和十六进制。因为8和16是2的整数次幂。

15.2.1 八进制

八进制基于8的幂,用0-7表示数字。每个八进制位对应三个二进制位。

15.2.2 十六进制

十六进制基于16的幂,用0-15表示数字,10-15分别用A-F表示(C语言中也可以用小写)。每个十六进制位对应四个二进制位。十六进制适合表示字节值。

C语言可以用位和字节进行一些操作。

15.3 C按位运算符

C语言提供按位逻辑运算符和移位运算符。按位运算符的数据对象用一般形式表示即可。

15.3.1 按位逻辑运算符

四个按位逻辑运算符都用于整型数据(包括char)。这些操作针对每个位进行,不影响其他位。

~是按位取反,把1变为0,0变为1。该运算符不改变原变量的值。

&是按位与,当两个相应的位都为1时才为1,否则为0。

|是按位或,如果两个相应的位有一个是1,结果就是1。只有都是0时结果才是0。

^是按位异或,如果相应的位有一个是1,有一个是0,结果就是1。如果都为1或都为0,结果为0。

15.3.2 用法:掩码

按位与运算符常用于掩码,掩码是设置为1或0的位组合。

把一个数与一个只有一位是1,其余位是0的位进行&运算,则只有这一位不变,其余位被置为0。

15.3.3 用法:打开位(设置位)

如果一个整数与另一个整数进行|运算,则该整数中对应另一个整数位为1的位被设置为1,其余位不变。利用这个原理可以打开位。

15.3.4 用法:关闭位(清空位)

如果一个整数与另一个整数进行&运算,则该整数中对应另一个整数位为0的位被设置为0,其余位不变。利用这个原理可以关闭位。

15.3.5 用法:切换位

用按位异或可以切换位。

15.3.6 用法:检查位的值

比较某一位的值需要覆盖其他位。

15.3.7 移位运算符

移位运算符向左或向右移动位。

<<将左侧运算对象每一位向左移动右侧运算对象指定的位数。移出左端的位的值丢失,用0填充右端位置。左移不改变原变量的值。

>>将左侧运算对象每一位向右移动右侧运算对象指定的位数。移出右端的位的值丢失,对于无符号整数,用0填充左端位置。有符号整数的效果取决于机器,可能用0填充,也可能用符号位填充。右移不改变原变量的值。

移位运算符对2的幂进行快速有效的乘法和除法。

移位运算符可用于从较大单元中提取一些位。

15.4 位字段

位字段是一个int或unsigned int类型变量中的一组相邻的位。位字段通过一个结构声明来建立。该结构声明给每个字段提供标签,并确定该字段的宽度。

用法是在成员名后面用一个冒号,在写上所占位的数量,然后分号结束。

可以用.访问成员,赋值。但是赋值不要超过位的数量能表示的最大值。

初始化位字段结构与初始化普通结构相同。

带有位字段的结构是记录设置的方便途径。

如果总位数超过一个字节,会用下一个字节的位置,一个字段不能跨越两个字节,编译器会自动移动,从而在上一个字节留下洞。可以用未命名的字段宽度填充洞。

字段存储在int的顺序取决于机器,有的是从左向右,有的是从右向左。位字段不易移植。

15.5 对齐特性(C11)

C11的对齐特性比用位填充字节更自然,表示了C语言在处理硬件相关问题上的能力。对齐指如何安排对象在内存中的位置。

_Alignof运算符给出一个类型的对齐要求,在此关键字后的圆括号中写上类型名即可。一般对齐值是2的非负整数次幂。

可以用_Alignas说明符指定一个变量或类型的对齐值。但是不能小于基本对齐值。该说明符是声明的一部分,说明符后面的圆括号包含对齐值或类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值