深入理解计算机系统(2.3)------布尔代数以及C语言运算符

  本篇博客我们主要讲解计算机中的布尔代数以及C语言的几个运算符。

1、布尔代数

  我们知道二进制值是计算机编码、存储和操作信息的核心,随着计算机的发展,围绕数值0和1的研究已经演化出了丰富的数学知识体系。而布尔代数便是乔治.布尔(George Boole)将逻辑值 True(真)和 False(假)编码为二进制0和1,用来研究逻辑推理的一门数学学科。

  对于布尔代数,我们需要知道以下几种常见的运算符:

  ①、布尔运算 ~ 对应逻辑运算非。也就是取反的意思,假设 p 是0,那么~p 就是1;反之亦然。

  ②、布尔运算 & 对应逻辑运算与。有且只有 p 和 q 都为 1 时,p & q 才等于1。

  ③、布尔运算 | 对应逻辑运算或。p 和 q 只要有一个为 1,那么 p | q 都等于1。

  ④、布尔运算 ^ 对应逻辑运算异或。如果p、q两个值不相同,则异或结果为1。如果p、q两个值相同,异或结果为0。

  上面说的规则都是单个二进制进行运算。如果将其扩大到w位二进制。比如两个二进制[aw,aw-1...a1]和[bw,bw-1...b1],它们的四种运算则是对两者每一个相对应的位上做相应的运算。

  这里我们给个例子:假设 w=4,a=[0110],b=[1100]。那么四种运算 a&b、a|b、a^b、~b 结果分别如下:

2、C 语言中的位级运算

  C 语言是支持按位布尔运算的。也就是我们上面所讲的四种布尔运算符其实也是 C 语言所使用的。在 C 语言中,这些运算符能运用到任何 “ 整型” 的数据类型。也就是声明为 char 或者 int 的数据类型,无论它们有没有 short、long或者  unsigned。下面给出对 char 数据类型表达式求值的例子:

3、C 语言中的 逻辑运算

  C 语言中的逻辑运算符 ||、&&、! ,分别对于命题逻辑中的或、与、非。注意 逻辑运算 和 位级运算 它们的功能是有很大的区别的。

  ①、逻辑运算认为所有非 0 的参数都表示 true,只有参数 0 表示 false。它们返回 0 或 1 ,分别表示结果 false 和 true。

  ②、逻辑运算 && 和 || 有短路功能。比如对于表达式 p&&q,p||q,如果p的值可以确定整个表达式的结果,那么将不会计算q的值(q可能是一个表达式)。但是对于p & q则不同,无论p表达式的值为何,都要计算q表达式的值。

4、C 语言中的 移位运算

  移位运算分为左移右移。

  左移:运算符是 << ,丢弃最高位,低位补0

    对于一个二进制数[aw,aw-1,...a1]来说,如果将它进行左移运算,则x << k = [aw-k,aw-k-1,...a1,0,...0]。此时相当于最高的那k位都被丢弃了,在最右端补了k个0。

   右移:运算符是 >>。右移一般机器支持两种形式,逻辑右移和算术右移。

    逻辑右移在左端补k 个0。C语言中对于无符号数据必须逻辑右移。

    算术右移是在左端补 k 个最高有效位的值。

   这在Java当中是有明确定义的。表达式 x>>k会将 x 算术右移 k 个位置。表达式 x>>>k 会将 x 逻辑右移 k 个位置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1

872
来自专栏阿杜的世界

【转】Java知识点集锦(1~40)

答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primi...

1082
来自专栏微信公众号:Java团长

Java知识点集锦

答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primi...

1301
来自专栏LanceToBigData

JavaProblem之hashCode详解

一、HashCode简介 1.1、什么是Hash和Hash表   要想清楚hashCode就要先清楚知道什么是Hash   1)Hash ? ?  hash是...

1978
来自专栏Java3y

LinkedHashMap就这么简单【源码剖析】

1694
来自专栏余林丰

Effective Java通俗理解(上)

  这篇博客是Java经典书籍《Effective Java(第二版)》的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗...

2957
来自专栏数据结构与算法

洛谷P3804 【模板】后缀自动机

1423
来自专栏CaiRui

Mysql-7-mysql函数

1.数学函数   用来处理数值数据方面的运算,主要的数学函数有:绝对值函数,三角函数,对数函数,随机函数。使用数学函数过程中,如果有错误产生,该函数会返回nul...

2087
来自专栏Ryan Miao

Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式

猪脚:以下内容参考《Java 8 in Action》 发布:https://ryan-miao.github.io/2017/07/15/java8-in-...

29410
来自专栏TechBox

为什么不能在init和dealloc函数中使用accessor方法前言为什么不能在init中调用accessor为什么不能在dealloc中调用accessor结尾

1583

扫码关注云+社区

领取腾讯云代金券