02_二进制数据(计算机科学)

带着问题学习(二进制数据)

  • 32位是几个字节?
  • 01011100对应的十进制是多少?
  • 00001111左移两位结果是多少?有什么规律?
  • 以补码形式表示的8位二进制数11111111,十进制为多少?
  • 二进制和十进制有什么区别?

为什么要使用二进制?

IC.png

        上图展示了一个较为简单集成电路的实例,而电脑就是由大量的集成电路芯片组成的,较为熟悉的CPU就是一个十分复杂的集成芯片。
        上图中的每一个管脚只有两种状态,分别是通电和不通电,那么这两种状态就可以对应二进制中的0和1,这就是为什么电脑中需要二进制进行运算。

二进制值能表达的含义

image.png

       二进制能够表示这么多种类的数据格式,归根结底就是在计算机中所有的数据都是以数值的形式存储的,它们唯一的区别是在解析的时候不同,不同的数据格式有着不同的解析方式。

二进制和十进制的转换

  • 二进制是一种计数方式
  • 二进制值不仅仅是一个数


    image.png

           上图展示了一个简单的浮点数和二进制数之间的转换。

二进制的运算

二进制表示负数

        在计算机中,是如何使用二进制表示负数呢?这就需要做一些硬性规定了,为了简单起见,我们拿一个char类型的数据类型举一个简单的例子。众所周知,一个char类型在计算机内存中占据8个bit,并且它的最高bit是用来表示正负号的,我们想知道-3的二进制char类型是什么样子,该怎么办呢?其实很简单,-3的二进制就是+3的二进制取反加1,过程如下:
3的二进制为:00000011
00000011取反为:11111100
11111100加1为:11111101
所以11111101就是-3的二进制表示。
我们可以再举一个例子,比如我们想知道-128的二进制表示,那么根据上面的过程:
128的二进制为:10000000
10000000取反为:01111111
01111111加1为:10000000
所以10000000就是-128的二进制表示。
相信通过上面的两个例子,您会对二进制表示负数有一个较为深刻的了解,如果您还不是太了解,我们再举一个简单的减法运算,比如10-7=?,我们知道,在计算机中,是没有减法运算的,它只有加法运算,所以我们不得不把上式改写为:10+(-7)=?,这样才能被计算机直接计算。现在的问题就是如何找到-7的二进制表示,和上面的方法一样:
7的二进制表示为:00000111
00000111取反为:11111000
11111000加1为:11111001
所以-7的二进制为:11111001
而10的二进制为:00001010
所以10+(-7)=00001010+11111001得出100000011共9bit,但是我们的数据类型是char,它只有8bit,所以不得不把最高位1舍弃,得到10+(-7)=00000011的值为3,和我们用十进制算的结果一模一样。
相信大家通过这几个例子,会对二进制表示负数以及计算机中对减法是如何操作了吧!!!

按位运算符

        C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或者无符号的char、short、int、long类型:

  1. & 按位与(AND);
  2. | 按位或(OR);
  3. ^按位异或(XOR);
  4. << 左移;
  5. 右移;

  6. ~按位求反(一元运算符)。
二进制的按位与运算符(&)

        只有两个位都是1的时候,这时的结果才是1,其它所有情况的结果都是0,比如:
1 & 1 的结果是:1;
1 & 0 的结果是:0;
0 & 1 的结果是:0;
0 & 0 的结果是:0。

二进制的按位或运算符(|)

        只有两个位都是0的时候,这时的结果才是0,其它所有情况的结果都是1,比如:
1 | 1 的结果是:1;
1 | 0 的结果是:1;
0 | 1 的结果是:1;
0 | 0 的结果是:0。

二进制的按位异或运算符(^)

        只有两个位不相等的时候,这时的结果才是1,其它所有情况的结果都是0,比如:
1 ^ 1 的结果是:0;
1 ^ 0 的结果是:1;
0 ^ 1 的结果是:1;
0 ^ 0 的结果是:0。

二进制左移

        假如有一个char类型的变量,它的值为3,那么它的二进制表示为:00000011,分别左移1位、2位和3位,我们看得到的数值是多少!
00000011左移1位,得到00000110,它的值为6;
00000011左移2位,得到00001100,它的值为12;
00000011左移3位,得到00011000,它的值位24,;
从上面不难得到这样的一个规律,就是在不溢出的情况下,左移几位,就表示原来的数乘以2的多少次幂。

二进制右移

        逻辑右移:我们把左边全部补0,不考虑符号位的右移称为逻辑右移。
        二进制的右移就不像二进制左移那样简单了。我们先看一个例子,还是以一个char类型的变量为例,它的值为-128,让它右移2位,如果按照左移的规律,那么-128右移2位的值应该是-128除以2的2次幂,即-32。那么我们下面来右移一下看看。我们再推倒一次-128的二进制表示:
128的二进制表示为:10000000(这里我们先不考虑最高位表示正负号,只是考虑数值的大小);
10000000取反后为:01111111;
01111111加1为:10000000;
所以-128的二进制表示为10000000。
假如我们还是按照左移的方式右移,那么10000000右移2位位00100000,很显然这不是一个负数,因为负数的最高位是1,这不是我们想要的结果,我们称这样的右移为逻辑右移。
        算术右移:左边补的数和符号有关的右移称为算术右移。
        我们还是拿char类型的变量,值为-128来举例子。从上面知道-128的二进制表示为:10000000。那么它算术右移2位是11100000,11100000是-32吗?一般人不好看出来,不过没关系,我们推倒一下-32的二进制不就行了嘛!!!
32的二进制表示为:00100000;
00100000取反后为:11011111;
11011111加1为:11100000。
所以-128算术右移后的二进制11100000值就是-32。
无论是逻辑右移还是算术右移,它们都有存在的意义。在单片机编程中,比如跑马灯程序的编写,就有可能需要逻辑右移,但是这些又不是数值,更不是负数,它只是一些简单的数据。

二进制的按位求反运算符(~)

        取反就是将0变成1.将1变成0,比如:
~1 的结果是:0;
~0 的结果是:1。

二进制数表示浮点数

关于浮点数的计算,这里有一个比较好的参考。
二进制表示浮点数
我们大概了解计算机中的浮点数是IEEE制定的一套表示方法,它的表示形式是科学计数法,如果想深入了解浮点数的表示请参考上面的链接,也可以自行查其它的资料,这里我们就不做深入讲解了。
由于计算机表示的浮点数大多数都是不精确的,只有部分小数是精确的(比如0.5、0.25、0.125等等),所以对于我们程序来说,重点要做的是:

  1. 不使用浮点数直接进行运算,而是使用整数进行运算,得到结果后,再除以相应的倍数,这样得到的结果才比较可靠;
  2. 在误差允许的情况下可以直接使用浮点数进行运算。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容