Lecture 02 Bits, Bytes, and Integer
通过位可以表示集合
例如,一个
通过上面的一一对应关系可以确认集合中的元素。
通过这种表示方法,二进制的位运算可以转换为集合之间的运算:
符号 | 位运算 | 集合运算 |
---|---|---|
& | 与 | 交集 |
| | 或 | 并集 |
^ | 异或 | 对称差 |
~ | 非 | 补集 |
通过逻辑运算符的短路特性可以避免访问空指针
int *p;
if (p && *p) {
...
}
当
位移运算
当进行位移运算时,向左位移只有唯一一种情况,而向右位移有两种情况,分为逻辑位移和算数位移。两种右位移的区别是填充方式不同。
位移方式 | 填充 |
---|---|
左位移 | |
逻辑右位移 | |
算数右位移 | 符号位( |
举例如下:
运算方式 | 二进制表示 |
---|---|
<< |
|
Log.>> |
|
Arith.>> |
运算方式 | 二进制表示 |
---|---|
<< |
|
Log.>> |
|
Arith.>> |
补码的实际含义
在有符号整数的计算过程中,将最高位作为负数进行计算,即可直接得到补码,而不需要取反再加一。
用5位数举例如下:
4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|
原码 | 16 | 8 | 4 | 2 | 1 |
补码 | -16 | 8 | 4 | 2 | 1 |
- 假设一个数为
,即 - 正常方式计算:补码
反码 原码 => - 新算法:补码
=>
通过这种方式可以更好理解补码编码后的极值问题。例如只有
无符号整数和有符号整数的转换关系
存在如图的映射关系,其中
的解释
编程时可能出现的问题
当
for (i = n - 1; i >= 0; i--) {...}
由于
当循环条件中出现sizeof(返回值为size_t,无符号)时容易出现该问题,如:
for (int i = n - 1; i - sizeof(char) >= 0; i--) {...}
此时由于sizeof(char)为无符号,因此运算时
符号位拓展
可以使用任意位作为符号位,不会影响数值大小。
当该数为正数时,填充符号位填充的数为
当该数位负数时,填充符号位填充的数为
计算补码可以发现,新填充的
举例:
- 原数为
,即 - 扩充一位后得到
, - 原数为
,即 - 扩充一位后得到
,
该操作也解释了右移位时算数移位的意义,即将右移位作为除
二进制截断
对于无符号整数,截断二进制的后
- 对于
,即 截断其后 位,得到 ,即 ,相当于对 取模。
对于有符号整数,没有计算方面的关联性,但是将其转换为无符号整数后可以进行相同的取模操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人