前言
这些知识在深入理解计算机系统这本书会详细介绍。本篇博客做个简单的整理和补充一点简单的离散数学知识。
布尔代数
1
表示逻辑值true
0
表示逻辑值false
依次可以做简单的bool运算
布尔运算
以下代码都是c语言
中对应运算符的表示方法,同时也会给出命题逻辑(离散数学会学)对应的符号。
取反: ~
假设有一个命题P
(以下符号是命题逻辑的写法)
当
P
=
0
¬
P
=
1
当
P
=
1
¬
P
=
0
当P = 0\quad \neg P=1\\ 当P =1\quad \neg P=0 % MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaakeaacqGHSca2aaa!412E!
当P=0¬P=1当P=1¬P=0
用c++验证一下(用~
表示取反)
与: &
c
语言的与在命题逻辑里叫做合取
,
记为
∧
c语言的与在命题逻辑里叫做合取,记为\wedge
c语言的与在命题逻辑里叫做合取,记为∧
假设有命题P
,Q
,给出表达式的真值表如下
P
Q
P
∧
Q
0
0
0
0
1
0
1
0
0
1
1
1
\begin{array}{}{\rm{P}}&{\rm{Q}}&{{\rm{P}} \wedge {\rm{Q}}}\\\hline0&0&0\\\hline0&1&0\\\hline1&0&0\\\hline1&1&1\end{array}
P0011Q0101P∧Q0001
用c++验证一下
或:|
c
语言的或在命题逻辑里被称为析取,记作
∨
c语言的或在命题逻辑里被称为析取,记作 \vee
c语言的或在命题逻辑里被称为析取,记作∨
假设有命题P
,Q
,给出表达式的真值表如下
P
Q
P
∨
Q
0
0
0
0
1
1
1
0
1
1
1
1
\begin{array}{}P&Q&{P \vee Q}\\\hline0&0&0\\\hline0&1&1\\\hline1&0&1\\\hline1&1&1\end{array}
P0011Q0101P∨Q0111
用c++验证一下
异或:^
异或在命题逻辑里记作
⊕
异或在命题逻辑里记作\oplus
异或在命题逻辑里记作⊕
假设有命题P
,Q
,给出表达式的真值表如下
P
Q
P
⊕
Q
0
0
0
0
1
1
1
0
1
1
1
0
\begin{array}{}P&Q&{P \oplus Q}\\\hline0&0&0\\\hline0&1&1\\\hline1&0&1\\\hline1&1&0\end{array}
P0011Q0101P⊕Q0110
可以记为相同为0,不同为1
位级运算
c/c++
支持对任意整形数据进行按位布尔运算。步骤如下
1.将参与运算两个的整数用二进制表示
2. 对每一位进行布尔运算
3. 计算的结果就是最终值
注:以上说的四种布尔运算都支持位级运算
int p = 6 & 3;
std::cout << p; //结果是2
下面给出运算过程
介绍一下异或的特点
- 两个相同的数异或结果为0,记为
a ^ a = 0
- 一个数异或0结果为0,记为
a ^ 0 = a
可以使用这个特性写一个程序,目标是不创建第三个临时变量,交换两个变量的值
交换两个变量的代码
因为将代码写在函数里,所以才创建了形参。如果直接写在main函数就不用创建新的变量了
#include <iostream>
void inplace_swap(int &x, int &y)
{
y = x ^ y; //步骤一
x = x ^ y; //步骤二
y = x ^ y; //步骤三
}
int main()
{
int a = 10;
int b = 9;
inplace_swap(a, b);
std::cout << "a==" << a << "\n"
<< "b==" << b;
return 0;
}
来看看每一个步骤发生了什么
步骤 | x | y |
---|---|---|
初始 | a | b |
步骤一 | a | a^b |
步骤二 | a ^ a ^ b =b | a^b |
步骤三 | b | a ^ b ^ b = a |
一些废话
本来想加上位移运算,再介绍一下最低最高有效位,但感觉篇幅太长就没加 😐
最近在自学《深入理解计算机系统》,因为这些运算符在大一已经学过了,所以写成博客复习一遍,顺便复习一下离散。应该没有什么错误。