bits bytes and integer
课件
第一部分:
第二部分:
课程连接
https://www.bilibili.com/video/BV1iW411d7hd?p=2
https://www.bilibili.com/video/BV1iW411d7hd?p=3
如何表示 bit
- 把模拟信号量化为 bit,高电平代表 1,低电平代表 0
- 存储 bit 比存储模拟信号要简单
字节
C 语言中变量的字节长度
不同的机器不一样
布尔运算
bit 向量布尔运算
bit 和集合
使用 bit 为来表示一个集合,布尔运算可以看做是对集合进行运算:
$
:交集|
:并集^
:对称差集(两个集合各自独有元素组成的集合)~
:补集(针对一个集合进行运算)
C 语言中的逻辑运算
注意
不要和布尔运算符号混淆
图中有一个语句,p && *p
,可以避免空指针引用。GPT 解释:
表达式 p && *p
用于 C 或 C++ 编程中,以确保安全地访问指针指向的值。这个表达式的目的是避免空指针访问,即访问一个未初始化或显式设置为 NULL 的指针,这通常会导致程序崩溃或未定义行为。
组件解释
- p: 这是一个指针变量。在 p && *p 的上下文中,先评估 p 确认它不是 NULL。在 C 或 C++ 中,NULL 指针表示没有指向任何内存位置的指针。
- *p: 这表示解引用 p,即访问 p 指向的值。如果 p 是一个空指针(NULL),解引用它将导致运行时错误。
操作过程
• 逻辑与操作 (&&): 这是一个短路逻辑操作符。它首先检查左侧的表达式(这里是 p),如果 p 为 NULL(在布尔上下文中等同于 false),则整个表达式立即求值为 false,右侧的表达式(*p)将不会被执行。这是关键的,因为它防止了在 p 为 NULL 时尝试解引用 p。
• 如果 p 不是 NULL,则表达式继续评估 *p。这里,*p 将检查 p 指向的值。如果该值为 0(或者在布尔上下文中视为 false),则整个表达式结果为 false。如果 *p 有一个非零值,整个表达式的结果是 true。
使用场景
这种模式经常出现在条件语句中,尤其是在处理可能为 NULL 的指针时。例如,在处理字符串或链表等数据结构时,经常需要检查指针是否为空,以及指向的数据是否有效或具有特定的值。
示例代码
在这个例子中,如果 get_string()
返回一个非 NULL 指针,且指向的第一个字符不是字符串结束字符 \0(在 C 中字符串以 \0 结尾),则第一个 printf 语句将执行。如果指针是 NULL 或指向的内容是 \0,则执行第二个 printf 语句。这种检查方式非常有用,可以避免在访问字符串或数组内容时出现错误。
位移运算
- 左移:最高位舍弃,低位补 0 即可。
- 逻辑右移:高位补 0
- 算术右移:高位补最高位的值
当使用右移运算符号的时候,大多数语言使用的是算术右移。但是 C 语言没有明确的规定是要使用逻辑右移还是算术右移。
如果移动的位数大于了本身的位数,大多数语言会先把移动的位数取模,再进行移动。
整数编码
如何快速的计算补码表示的十进制数笔记中使用的原理其实就是这个幻灯片中所提到的。
数的范围
- 无符号数
- 最小值:0
- 最大值:2 的 w 次方 - 1
- 有符号数
- 最小值:负的 2 的 w-1 次方
- 最大值:2 的 w-1 次方 - 1(因为最高位被用来作为符号位,所以这里是 w-1)
- 最大的负值:-1
在补码中,最大的数字 3(2 的 3-1 次方)加上 1 之后,会变成最小的负数。相当于走到了尽头,又回到起点了。
上图还体现出了一个规律,当要计算补码 101
所代表的十进制数值时,只需要找到其按照 Y 轴的对称的数字即可。即先把 01
取反得到 10
,再加个 1。
常用的数
补码和无符号数之间的转换
todo https://www.bilibili.com/video/BV1iW411d7hd?t=3471.5&p=2