大家好,如果您还对一篇文章详细讲解了原码、补码、补码和位运算不太了解,没有关系,今天就由本站为大家分享一篇文章详细讲解了原码、补码、补码和位运算的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
想一想:如果计算机直接用机器数进行计算,(+1)+(-1)等于什么?
原码
原码是该值的机器号,即最高位是该值的符号位,其余位代表该值。这是人脑最容易理解和计算的表示形式。
[+1]=[00000001]原始
[-1]=[10000001]原始
想一想:考虑到符号,一个8位二进制数的取值范围是多少?
[-127,127]
反码
补码表示为:正数的补码是其本身,负数的补码以其原码为基础。符号位保持不变,其余位反转。
[+1]=[00000001]原值=[00000001]逆值
[-1]=[10000001]原始=[11111110]逆
补码
补码表示方法为:正数的补码是其自身,负数的补码是在其补码的基础上+1。
[+1]=[00000001] 原值=[00000001] 逆值=[00000001] 补码
[-1]=[10000001] 原=[11111110] 逆=[11111111] 补
特别:00000000 代表0的原码、反码、补码
10000000 代表原码-128
那么-128的补码是11111111
-128的补码也是10000000
想一想:使用补码算术,(+2) + (-2) 等于什么?
2-2=2 + (-2)
=0000 0010(原始) + 1000 0010(原始)
=0000 0010(反向) + 1111 1101(反向)
=0000 0010(补码) + 1111 1110(补码)
=1 0000 0000 (补码) — 从最高位开始产生进位,并丢弃进位
=0000 0000(补码)
=0000 0000(相反)
=0000 0000(原始)
=0
在计算机中,所有数字都以二进制补码形式存在。补码可以简化运算,变减法为加法。
总结:
正数:原码=补码=补码
练习1
1. 求+119 ______ ______ ______的原码、反码和补码。
2. 求-56 ______ ______ ______的原码、反码和补码。
3. (2017 NOIP) 在8位二进制补码中,10101011表示的数字是十进制(B)。
A.43 B.-85 C.-43 D.-84
什么是位运算?
在现代计算机中,数据以二进制形式存储。对于计算机中的每一位,可以存储0和1两种状态。计算机对每一位进行的运算都是“位运算”,即符号位一起参与运算。
位逻辑运算符:
位移位运算符:
位逻辑运算符
位逻辑运算是将每个二进制位作为布尔值进行布尔运算,以逻辑中的真与假(1和0)为操作单位,运算结果也是真或假(1或0) 0)。
需要注意的是,位运算是针对二进制运算,计算机中的数字以补码形式存在。因此,在手动进行位运算计算时,需要将数字转换为二进制补码表示形式,右对齐,然后对位进行位运算。
例如3 5,先以补码形式写入0000 0011和0000 0101,然后进行右对齐操作。
按位与
运算规则:当两位都为1 时,结果为1。
运算方法:将数转换为补数,然后对位进行与运算,然后将结果转换为原码(或原码对应的十进制数)
练习2
1. 表达式0x130x17 的值为______;
2、若x=-2,y=3,则xy的结果为______;
3. 如果x=-2,y=-3,则xy 的结果是______。
按位或 |
运算规则:只要两位中有一个1,结果就是1。
运算方法:将数转换为补数,然后对位进行或运算,然后将结果转换为原码(或原码对应的十进制数)
练习3
1. 表达式0x13的值|0x17 是_______;
2. 如果x=-2,y=3,则x | 的结果y 是_______;
3. 如果x=-2,y=-3,则x | 的结果y 是_______。
按位异或 ^
运算规则:两位不同则为1,相同则为0。
运算方法:将数转换为补数,然后对位进行异或运算,然后将结果转换为原码(或原码对应的十进制数)
练习 4
1. 表达式0x13 ^0x17 的值为_______;
2、若x=-2,y=3,则x^y的结果为________;
3. 如果x=-2,y=-3,则x^y的结果是________。
按位取反 ~
运算规则:0变1,1变0。
运算方法:将数转换为补码,然后将位取反,然后将结果转换为原码(或原码对应的十进制数)
练习 5
1. 表达式~0x17 的值是多少?
2. 表达式~ -3 的值是多少?
位移运算符
位移位运算是将运算对象的所有数字向左(或右)移动一定的位数。
左移():左移X位,值变为原值的2^X倍
右移():右移X位,将值的大小缩小为原值的2^X倍
左移
运算规则:左移X位,值大小扩大2^X倍。
操作方法:不考虑溢出,将除法符号位中的整个数左移,低位(右边空位)补0
快速运算:即直接乘以2^X
右移
运算规则:右移X位,值大小减少2^X倍
操作方法:在不考虑溢出的情况下,将数字转换为补码,将所有数字整体右移,并对高位中的符号位(左边的空位)进行补码
快速运算:直接除以2^X并向下舍入。请注意,负数向下舍入,例如:35.0/4=-9。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/99565.html
用户评论
全网暗恋者
这个讲解真棒!我一直在迷茫这些概念,终于明白了! 原码、反码和补码都是很重要的概念,特别是位运算,感觉这篇文章把它们解释得非常清楚易懂。
有8位网友表示赞同!
嗯咯
reszcie kumam jak dziala to wszystko!
有17位网友表示赞同!
病态的妖孽
讲的太棒了!之前真的对原码、反码、补码一头雾水, 现在终于理解了它们的含义和用途。位运算更是让我眼前一亮,要好好研究一下这种高效的操作方式。
有16位网友表示赞同!
莫失莫忘
感觉还蛮累赘的,不如直接上手代码练习更有效率啊。不过这篇文章确实提供了比较全面的理论基础,算是打下了知识储备吧。
有15位网友表示赞同!
凉凉凉”凉但是人心
我以前只知道补码在计算机里使用,没想到它还有其他形式呢!这个解释帮我开阔了眼界,原来计算机制如此复杂,真是让人敬佩!
有7位网友表示赞同!
看我发功喷飞你
其实很多例子都过于简单化了,对于一些更复杂的操作场景,这篇文章好像没做太多解释。希望作者能够补充一些复杂的应用实例。
有8位网友表示赞同!
水波映月
终于找到一篇讲清楚原码、反码、补码的文章啦!之前网上看到的都是些乱七八糟的,弄得我更加不明白。感谢作者!
有6位网友表示赞同!
一笑傾城゛
说的太复杂了一点,我这种学计算机刚入门的人感觉很难理解。希望能用更通俗易懂的语言讲解一下原理。
有16位网友表示赞同!
早不爱了
位运算真的很强大,应用场景很多!希望以后有机会深入学习它,提高编程效率
有11位网友表示赞同!
呆檬
对于想要深入了解计算机原理的人来说,这篇文章是个很好的开篇!原码、反码的定义和举例都很有帮助,补码是如何转化的也解释得很清楚,值得细读
有14位网友表示赞同!
夏日倾情
我感觉这个文章缺少一些实际应用场景,比如在嵌入式系统或网络编程中,原码、反码等概念是怎么运用的?
有9位网友表示赞同!
熟悉看不清
很棒的文章!对提高我对计算机底层原理的理解很有帮助。以后在写汇编代码时,这些知识就会显得尤为重要了
有14位网友表示赞同!
艺菲
希望能看到更多关于位运算实例和应用的讲解,比如常见的操作指令、它们背后的逻辑等等。
有15位网友表示赞同!
大王派我来巡山!
这个文章写的真详细! 原码、反码、补码都解释得很清楚。我之前一直以为它们只是简单的概念而已,没想到背后还有这么多的数学原理在支撑着!
有8位网友表示赞同!
不忘初心
感觉有些知识点连接不够紧密,比如反码和补码之间的关系不太清晰。 希望能提供更直观的例子进行说明。
有13位网友表示赞同!
烟雨萌萌
学习了这段代码后,我对原码、反码、补码的理解又更加深刻了! 原来它们的作用不仅仅局限于数字转换,还有广泛应用在计算逻辑当中!
有12位网友表示赞同!
逾期不候
很感谢作者分享如此宝贵的信息!这篇文章不仅帮我在理论层面加深了我对原码、反码、补码的了解,还让我明白了如何利用位运算提高代码效率。
有19位网友表示赞同!