bits bytes and integer

课件

第一部分:

pdf 文件

第二部分:

pdf 文件

课程连接

https://www.bilibili.com/video/BV1iW411d7hd?p=2

https://www.bilibili.com/video/BV1iW411d7hd?p=3

如何表示 bit

2024053116595721.png

字节

2024053117035362.png

C 语言中变量的字节长度

不同的机器不一样

2024053117061533.png

布尔运算

2024053117090427.png

bit 向量布尔运算

2024053117103049.png

bit 和集合

2024053117132833.png
使用 bit 为来表示一个集合,布尔运算可以看做是对集合进行运算:

C 语言中的逻辑运算

2024053117222590.png

注意
不要和布尔运算符号混淆

图中有一个语句,p && *p,可以避免空指针引用。GPT 解释:

表达式 p && *p 用于 C 或 C++ 编程中,以确保安全地访问指针指向的值。这个表达式的目的是避免空指针访问,即访问一个未初始化或显式设置为 NULL 的指针,这通常会导致程序崩溃或未定义行为。

组件解释

操作过程
逻辑与操作 (&&): 这是一个短路逻辑操作符。它首先检查左侧的表达式(这里是 p),如果 p 为 NULL(在布尔上下文中等同于 false),则整个表达式立即求值为 false,右侧的表达式(*p)将不会被执行。这是关键的,因为它防止了在 p 为 NULL 时尝试解引用 p。
• 如果 p 不是 NULL,则表达式继续评估 *p。这里,*p 将检查 p 指向的值。如果该值为 0(或者在布尔上下文中视为 false),则整个表达式结果为 false。如果 *p 有一个非零值,整个表达式的结果是 true。

使用场景
这种模式经常出现在条件语句中,尤其是在处理可能为 NULL 的指针时。例如,在处理字符串或链表等数据结构时,经常需要检查指针是否为空,以及指向的数据是否有效或具有特定的值。

示例代码

char *p = get_string();
if (p && *p) {
printf("Pointer is not null and points to a non-zero value.\n");
} else {
printf("Pointer is null or points to zero.\n");
}

在这个例子中,如果 get_string() 返回一个非 NULL 指针,且指向的第一个字符不是字符串结束字符 \0(在 C 中字符串以 \0 结尾),则第一个 printf 语句将执行。如果指针是 NULL 或指向的内容是 \0,则执行第二个 printf 语句。这种检查方式非常有用,可以避免在访问字符串或数组内容时出现错误。

位移运算

2024060512125887.png

当使用右移运算符号的时候,大多数语言使用的是算术右移。但是 C 语言没有明确的规定是要使用逻辑右移还是算术右移。

如果移动的位数大于了本身的位数,大多数语言会先把移动的位数取模,再进行移动。

整数编码

2024060715275450.png

如何快速的计算补码表示的十进制数笔记中使用的原理其实就是这个幻灯片中所提到的。

数的范围

2024060715580484.png

在补码中,最大的数字 3(2 的 3-1 次方)加上 1 之后,会变成最小的负数。相当于走到了尽头,又回到起点了。
2024060716214399.png

上图还体现出了一个规律,当要计算补码 101 所代表的十进制数值时,只需要找到其按照 Y 轴的对称的数字即可。即先把 01 取反得到 10,再加个 1。
2024060716302090.png

常用的数

2024060716315314.png
2024060716331873.png

补码和无符号数之间的转换

2024061014062046.png
2024061014063268.png
2024061014064400.png
2024061014065902.png
2024061014071356.png

todo https://www.bilibili.com/video/BV1iW411d7hd?t=3471.5&p=2