尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解。

    本篇文章便是在结合百度百科有关原码反码补码位运算的介绍并深度借鉴了张子秋Liquor相关文章后整理而出。
 
目录:
    一、机器数和真值
    二、原码,反码和补码的基础概念
    三、为什么要使用原码,反码和补码
    四、原码,补码,反码再深入
    五、数据溢出测试
    、位运算的运算说明
    七、位运算的简单应用 
 

一、机器数和真值
 
    机器数(computer number)是数字在计算机中的二进制表示形式
    机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制
    比如:十进制中的+6,计算机字长为8位,转换成二进制就是00000110,如果是-6,就是10000110
    这里的00000110和10000110便是机器数
 
    因为第一位是符号位(正数该位为0,负数该位为1,0分+0和-0),所以:
        ①8位二进制数的取值范围就是:[1111 1111 , 0111 1111]
        ②机器数的形式值就不等于真正的数值。
            为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
            比如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
 
 
二、原码,反码和补码的基础概念
 
    对于一个数, 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式
        [+1] = [00000001]原 = [00000001]反 = [00000001]补
        [-1] = [10000001]原 = [11111110]反 = [11111111]补
 
    1.原码
        原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
    2.反码
        正数的反码是其本身
        负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
    3.补码        
        正数的补码就是其本身
        负数的补码即是在反码的基础上+1
 
    由此可见,正数的原码反码补码都是自身,负数的反码,补码都无法直观看出其数值,需要转换成原码再计算其数值
 
 
三、为什么要使用原码,反码和补码
 
    对于计算机,加减乘数已经是最基础的运算, 要设计的尽量简单,而让计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂。于是人们开始探索将符号伪参与运算,并且只保留加法的方法
 
    若用原码计算十进制减法:1-1=0,结果是不正确的:
        1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
    使用反码时,结果的真值部分正确:
        1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
    而反码的问题在于0上,反码中会有[0000 0000]原=+0和[1000 0000]原=-0两个编码表示0,于是出现了解决这一问题的补码[1000 0000]补(8位二进制机器数中,补码还能够多表示一个最低数-128=[1000 0000]补):
        1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
 
 
四、原码,补码,反码再深入
 
    再次推荐张子秋有关原码反码补码的博客,里面还讲了同余的概念与负数取模,自己也就不摘抄了。。
    x mod y等于 x 减去 y 乘上 x与y的商的下界
    一个数的反码, 实际上是这个数对于一个膜的同余数,而这个膜并不是我们的二进制, 而是所能表示的最大值
    由于0的特殊情况, 没有办法表示128, 所以补码的取值范围是[-128, 127]
 
 
五、数据溢出测试
 
 
六、位运算的运算说明
 
    1. & 按位 与「AND」
        功能:对应的两个二进位 均为1 时,结果 为1,否则 为0
        例子:9&5 = 1001&0101 = 0001,即 9&5=1
        *规律:二进制中与 1& 保持原位,与  0& 为0
 
    2. | 按位 或「OR」
        功能:对应的两个二进位 只要有一个为1 时,结果 为1,否则 为0
        例子:9|5 = 1001|0101 = 1101,即 9|5=13
 
    3. ^ 按位 异或「XOR,EOR」
        功能:对应的两个二进位 不相同 为1,否则 为0
        例子:9^5 = 1001^0101 = 1100,即 9^5=12
        *规律:
            同一整数 相异或 为0,               例:5^5=0
            不同整数 相异或 结果和顺序无关,例:5^6^7 = 5^7^6
            任何数 和 0 异或 结果不变,        例:x^0 = x
            综上,x^y^x = x^x^y = 0^y = y
 
    4. ~ 按位 取反「NOR」
        功能:对整数的 每一位取反,符号也位取反「取反:0取反为1,1取反为0」
        例子:~9 = -10(因为负数是补码存储的)
            ~9=~[00001001]原=[11110110]补=[11110101]反=[10001010]原=-10
 
    5. << 左移(shl)
        格式:整数<<左移个数
        例子:x << n
        实质:x * 2n
        操作:把 x 的二进制位 向左移动 n 个单位,高位丢弃,低位补0
 
    6. >> 右移(shr)
        格式:整数>>右移个数
        例子:x >> n
        实质:x / 2n
        操作:把 x 的二进制位 向右移动 n 个单位,低位丢弃,符号位不变
        注意:符号位也跟着移动, 右移不改变整数的正负, 最后符号位要调整为原来的数值
        正数 符号位为 0, 最高位补0
        负数 符号位为 1, 最高位补1
 
 
七、位运算的简单应用
 
    1.(& 按位 与「AND」)奇偶判断
        取模判断:a%2?printf(“奇数\n”):printf(“偶数\n”);
        与壹判断:a&1?printf(“奇数\n”):printf(“偶数\n”);
 
    2.(^ 按位 异或「XOR,EOR」)数值转换
        借助第三方变量:temp = a;a = b;b = temp;
        不借助额外空间,数学法:a = b - a;b = b - a;a = b + a;
        不借助额外空间,位运算:a = a ^ b;b = a ^ b;a = a ^ b;
 
    3.(<< 左移 和 >> 右移)优化乘除法效率
        a shl b 的值等于a乘以2的b次方
        a shr b 比如二分查找、堆的插入操作等等
 

「C语言」原码反码补码与位运算的更多相关文章

  1. C语言原码反码补码与位运算.

      目录:     一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算 ...

  2. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  3. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  4. java原码反码补码以及位运算

    原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...

  5. C语言基础(4)-原码,反码,补码及sizeof关键字

    1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...

  6. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  7. 原码 & 反码 & 补码 & 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. python之计算机硬件基本认知_数据单位_进制间转换_数的原码反码补码

    一:计算机硬件基本认知 cpu:   中央处理器.   相当于人的大脑.运算中心,控制中心. 内存:  临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘:  长期存储数据. ...

  9. C 标识符, 数据存储形式(原码,反码,补码)

    一.  标识符 第一个字母必须是英文字母或下划线 二. 数据存储形式(补码存储) 最高位是符号位 ---- 0表示整数 ; 1 表示负数 1. 正数:原码 = 反码 = 补码 例子 : (10) 原码 ...

随机推荐

  1. JS原型与原型链(好文看三遍)

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象. 下面举例说明: function ...

  2. C 标准库 - string.h之strlen使用

    strlen Returns the length of the C string str. The length of a C string is determined by the termina ...

  3. 游戏开发者注意!这个音频SDK可以完美兼容所有主流游戏引擎

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 在网络游戏中,无论是大逃杀.棋牌类.电子竞技类还是娱乐休闲类小游戏,玩家和玩家之间的互动.语音聊天是一 ...

  4. LumiSoft

    SVN: https://svn.lumisoft.ee:8443/svn/LumiSoft_Net/ User: readonly Password: readonly Download: http ...

  5. 《Maven实战》关联实际工作的核心知识

    通读了<Maven实战>这本书,由于在实际的工作中,对其有一定的操作上的经验.因此,再回头去通读这本书,就能够更加精准的把握里面的核心知识了. 以下我主要从两点去介绍之—— 1> m ...

  6. Azure 上 Linux 虚拟机 Mac 地址的持久化

    有些用户在使用 Azure Linux 虚拟机安装软件时,有些软件的 license 会和当前系统的 mac 地址绑定,那么在 Azure VM 重启,reszie(改变尺寸大小),停止然后再启动的时 ...

  7. 三年从前端小工到架构-知乎 Live 学习整理

    最近在知乎上学习了vczero (王利华,簋谣)的知乎Live「三年从前端小工到架构」,感觉受益匪浅,现将本次Live学习笔记记录如下. 本次 Live 主要包括以下内容   • 0-3 年的前端工程 ...

  8. 数据结构--ADT

    好吧,这个没什么好讲的,写过java代码的人估计一直都在用ADT, ADT,其实就是abstract data type,抽象数据类型,额,其实他丫就是,java 的class...... 不过关于A ...

  9. 谷歌在线appspot平台教你学Hacker(由浅如深)-XSS篇

    练习链接 http://google-gruyere.appspot.com/ 点开是纯英文的 直接点翻译即可 一 .part1 http://google-gruyere.appspot.com/p ...

  10. 紫书第5章 C++STL

    例题 例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474) 主要是熟悉一下sort和lower_bound的用法 关于lower_bound: http://blo ...