详细解释c++语言中的布尔运算,位级运算。

前言

这些知识在深入理解计算机系统这本书会详细介绍。本篇博客做个简单的整理和补充一点简单的离散数学知识。

布尔代数

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=1P=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} P0011Q0101PQ0001
用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} P0011Q0101PQ0111

用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} P0011Q0101PQ0110
可以记为相同为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;
}

来看看每一个步骤发生了什么

步骤xy
初始ab
步骤一aa^b
步骤二a ^ a ^ b =ba^b
步骤三ba ^ b ^ b = a

一些废话

本来想加上位移运算,再介绍一下最低最高有效位,但感觉篇幅太长就没加 😐
最近在自学《深入理解计算机系统》,因为这些运算符在大一已经学过了,所以写成博客复习一遍,顺便复习一下离散。应该没有什么错误。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值