精华内容
下载资源
问答
  • 什么会产生补码?补码怎么计算二进制的相反数怎么表示?

    为了区分正负,二进制数用最高位来表示符号,1为负,0为正。用8位二进制数举例,0000 0001=1,1000 0001=-1。

    十进制中相反数直接在数字前加负号就可,那么二进制的相反数怎么求呢?不管是十进制还是二进制,相反数的意义都是指:该数+该数的相反数=0。比如 0000 0011 + 它的相反数 = 0000 0000 ,那么 0000 0011的相反数=0000 0000 - 0000 0011 = 1111 1101,直观上理解就是一个数的相反数=对该数按位取反再加1。

    下面从理论推导一下:对于某个不为0的二进制数来说,该数+它的相反数=0000 0000,那么该结果一定是由于进位溢出造成的(用二进制相加看,不要用十进制看),相当于1111 1111 + 0000 0001 = 0000 0000,用未溢出的值代替0000 0000,即 该数 + 它的相反数=1111 1111 + 0000 0001,-->  它的相反数 = 1111 1111 - 该数 +0000 0001,1111 1111 - 该数 就相当于对该数按位取反,所以二进制数的相反数就是对其按位取反加1。

    我们自己理解的话0000 0011=3,它的相反数为-3=1000 0011,但0000 0011 + 1000 0011 != 0000 0000,所以计算机就引入了补码,相当于上面的相反数的表示。将人容易理解的二进制称为原码,计算机实际使用时用的是补码。正数的补码就是自己,负数的补码为按位取反加1。

    对于1000 0011来说,若其为原码,则表示-3;若其为补码,则表示(-1)*2^7 + 1*2^1 + 1*2^0 = -125。

    展开全文
  • 前言 看了好多大佬的视频,或多或少都推荐了一本《码出高效 Java开发...二进制是什么,以及简单的运算 我们学计算机的,或者准备入门的都知道,这个世界上又10种人,一个是懂二进制的,一个是不懂二进制的。那么二进制

    前言

    看了好多大佬的视频,或多或少都推荐了一本《码出高效 Java开发手册的书》,我也跟着大佬们买了一本,就当作是读书笔记,记录下我看到了什么,本人比较懒,可能读的很慢,而且记录的可能不全,设计的知识面也很浅显,如有错误或遗漏,还请读者斧正。另外十分推荐这本书,如果是萌新的话,也不是说看不懂,但是应该十分吃力,不是特别建议使用《码出高效》入门。

    1.1 走进0与1的世界

    二进制是什么,以及简单的运算

    我们学计算机的,或者准备入门的都知道,这个世界上又10种人,一个是懂二进制的,一个是不懂二进制的。那么二进制具体是什么呢?

    说实话,我也没什么自信能够说清楚,按照我自己的话就是:二进制就是一种数字表达形式,就像日常生活中的十进制数字一样,不过逢十进一变成了逢二进一了而已。书上的内容是:简单的说,计算机就是晶体管,电路板组装起来的电子设备,无论是图形图像的渲染,网络远程共享,还是大数据计算,归根结底多是0与1的信号处理。信息存储和逻辑计算的元数据,只能是0和1,但是它们在不同的介质里的物理表现方式却不是一样的,如三极管的通电和断电、CPU的低电平和高电平、磁盘的电荷左右方向。明确了0与1的物理表现形式后,设定基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,所以称为二进制。

    1 = 1、10 = 2、100 = 4、1000 = 8、11000 = 24,即2^0 = 1、2^1 = 2、2^3 = 8、2^4 + 2^3 = 24

    如何表示负数?答:二进制最左侧的数字表示符号位,0表示整数,1表示复数。00100011 = 35,10100011 = -35。

    如果使用二进制进行运算的话,就需要了解原码,反码,补码是什么。原码就是将原数字(十进制)变成二进制的样子,注意符号位。正数的补码与原码,反码是一样的,而负数的补码是反码加1的结果。(反码对于负数来说就是原码取反,将原来是0变成1,将1变成0,符号位保持不变)二进制运算都是使用补码进行运算的,只有加法,但是如果加上一个负数,就变成减法了,且符号位也参加运算超出的部分不计(如 00100011 + 11011101 = 00000000,正常来说因该是100000000,但是超出部分不算,就应该舍弃得到正确结果 35+ (-35) = 0)

    00100011 = +35(正35的补码),11011101 = -35(负35的补码)

    位移运算

    这是一个大家很熟悉又很陌生的操作,可能你可能听说过,一般情况下,位移运算比乘法或者除法运算,运行的更快,但是位移运算真的就像我们印象中的那样,是简单的乘以2x或2x吗?

    “别人家的开发工程师”在代码中经常使用这种操作方式进行高低位截取,哈希计算,甚至运用在乘除法运算中。向右移动1位近似表示除以2,十进制的奇数转化为二进制数后,在向右移动中,最右边的1将被直接抹去,说明向右移对于奇数并非完全相当于除以2。在左移<<与右移>>两种运算中,符号位均参与移动,除负数往右移动,高位补1之外,其他情况均在空位出补0

    正数/负数 向左移<<1位 向右移>>1位
    正数(35的补码00100011 01000110 = 26+22+2^1 = 70 00010001 = 24+26 = 17(近似除2)
    负数(-35的补码11011101 10111010 =1(1000101+1) = -70 11101110 = 1(0010001+1) = -18
    正数(99的补码01100011 11000110 = -58 00110001 = 49
    负数(-99的补码10011101 00111010 = 58 11001110 = -50

    左移运算由于符号位参与向左移动,在移动后的结果中,最左位可能是1或者0,即正数向左移动的结果可能是正,也可能是负数。负数向左移动的结果同样可能是正,也可能是负。

    对于三个大于号的>>>无符号向右移动(注意不存在<<<无符号向左移动的运算方式),当向右移动时,正负数最高位均补0,正数不断向右移动的最小值是0,而负数不断右移的最小值是1.无符号意思为藐视符号位,符号位失去特权,必须向其他平常的数字位一起向右移动,高位直接补0,根本不关心是正数还是负数。次运算常用在高位转低位的场景中,如下表左侧为均补0.

    正数/负数 向右移>>>1位 向右移>>>2位 向右移>>>3位
    正数(35的补码 00100011) 00010001 = 17 00001000 = 8 00000100 = 4
    负数(-35的补码 11011101) 01101110 = 110 00110111 = 55 00011011 = 27

    为何负数不断地无符号右移的最小值是1呢?在实际编程中,位移运算仅作为用于整形(32位)和长整型(64位)数上,假如在整形数上移动的位数是32位,无论是否带符号以及移动方向,均为本身。 因为移动的位数是一个mod32的结果,即35>>1和35>>33是一样的结果。

    按位取反(符号~),按位与(符号&),按位或(符号|),按位异或(符号^)

    其中,按位与(&)运算典型的场景就是获取网段值,IP地址与掩码255.255.255.0进行按位与运算得到最高24位,即为当前IP的网段。按位运算的左右两边都是整形数。true&false这样的方式也是合法的,因为boolean底层表示也是0与1.

    按位与和逻辑与(符号位&&)运算都可以作用于条件表达式,但是后者有短路功能,表达式如下:

    boolean a = true;
    boolean b = true;
    boolean c = (a=(1 == 2))&&(b = (1 == 2))
    

    因为&&前边的条件表达式,即(a=(1 == 2))的结果位false,触发短路,直接退出,最后a的值位false,b的值位true。假如把&&变成&,则执行的结果a和b都是false。同样逻辑或(||)也具有短路功能。

    逻辑或,逻辑与运算只能针对布尔类型的条件表达式进行运算,7&&8这种运算表达式是错误的。

    异或运算没有短路能力,符号在键盘的数字6上方,在哈希算法中用于离散哈希值,**对应的位上不一样才为1,**比如:1^1 = 0、1^0 = 1、0^0 = 0、0^1 = 1

    以上就是阅读《码出高效》1.1的个人总结的内容,知识还蛮多的,但是在书上只有两页,我竟然妄图一下午看完,真的是蜉蝣撼大树,不自量力。

    展开全文
  • 每次都在课本的最前几页,来上这么一段:什么反码原码除符号位,按位取反。补码等于反码加一。然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。 我原来也看了好几遍都没看...

    我在做题时遇到这么一个问题:
    unsigned short A = 10; printf("~A = %u\n", ~A); char c=128; printf(“c=%d\n”,c); 输出多少?并分析过程?
    这个问题就涉及到二进制数在计算机中存储与计算的问题,为了深入重新理解这个“老问题”我发现了这么一篇关于原码补码反码文章,接下来让我们一同感受计算机的美妙~

    本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于:负数的补码等于反码加一。

    接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段:什么反码是原码除符号位,按位取反。补码等于反码加一。然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。

    我原来也是看了好几遍都没看懂。古人云:事不过三。学C语言的时候,看过一次。不懂?看《计算机基本组成原理》的时候看过,还是不懂!到了大三,上《单片微机原理与接口技术》的时候仍旧是不懂。到了期末,复习的时候,和宿舍的人瞎聊。说讲讲这些码呀,我说我也不是很清楚呀。然后就一边说怎么求码,一边算。玩着玩着,突然就明白了。我说好,打住。不说了,放假我在好好整理下思路,于是就有了这篇额。。算讨论帖吧。

    好了,废话不多说。开始我们的原码,反码,补码之旅。

    (一)预备知识

    认识二进制,十六进制。会二进制与十进制的相互转化运算

    由计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。

    根据冯~诺依曼提出的经典计算机体系结构框架。一台计算机由运算器,控制器,存储器,输入和输出设备组成。其中运算器,只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法器硬件开销太大,被废了 )

    所以,计算机中的没法直接做减法的,它的减法是通过加法来实现的。你也许会说,现实世界中所有的减法也可以当成加法的,减去一个数,可以看作加上这个数的相反数。当然没错,但是前提是要先有负数的概念。这就为什么不得不引入一个该死的符号位。

    而且从硬件的角度上看,只有正数加负数才算减法。
    正数与正数相加,负数与负数相加,其实都可以通过加法器直接相加。
    原码,反码,补码的产生过程,就是为了解决,计算机做减法和引入符号位(正号和负号)的问题。

    本文可能比较长,没必要一下子读完。原码,反码,补码,按章读。
    重点在于讲补码,到了补码可能有些绕,建议带着笔,写出二进制数一起算。

    表达可能不够清楚严谨,望见谅。

    (二)原码

    原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

    若以带符号位的四位二进值数为例

    1010 : 最高位为‘1’,表示这是一个负数,其他三位为‘010’,
    即(02 ^ 2)+(12 ^ 1)+(0*2 ^ 0)=2(‘ ^ ’表示幂运算符)
    所以1010表示十进制数(-2)。
    下图给出部份正负数数的二进制原码表示法

    OK,原码表示法很简单有没有,虽然出现了+0和-0,但是直观易懂。
    于是,我们高兴的开始运算。

    0001+0010=0011 (1+2=3)OK 0000+1000=1000 (+0+(-0)=-0) 额,问题不大
    0001+1001=1010 (1+(-1)=-2)

    噢,1+(-1)=-2,这仿佛是在逗我呢。

    于是我们可以看到其实正数之间的加法通常是不会出错的,因为它就是一个很简单的二进制加法。

    而正数与负数相加,或负数与负数相加,就要引起莫名其妙的结果,这都是该死的符号位引起的。0分为+0和-0也是因他而起。

    所以原码,虽然直观易懂,易于正值转换。但用来实现加减法的话,运算规则总归是太复杂。于是反码来了。

    (三)反码

    我们知道,原码最大的问题就在于一个数加上他的相反数不等于零。

    如:0001+1001=1010 (1+(-1)=-2) 0010+1010=1100 (2+(-2)=-4)

    于是反码的设计思想就是冲着解决这一点,既然一个负数是一个正数的相反数,那我们干脆用一个正数按位取反来表示负数试试。

    反码:正数的反码还是等于原码

    负数的反码就是他的原码除符号位外,按位取反。

    若以带符号位的四位二进制数为例:

    3是正数,反码与原码相同,则可以表示为0011
    -3的原码是1011,符号位保持不变,低三位(011)按位取反得(100)
    所以-3的反码为1100
    下图给出部分正负数的二进制数反码表示法

    对着上图,我们再试着用反码的方式解决一下原码的问题

    0001+1110=1111 (1+(-1)= - 0)

    互为相反数相加等于0,解决。虽然是得到的结果是1111也就是-0

    好,我们再试着做一下两个负数相加

    1110(-1)+1101(-2)=1011(-4)

    噢,好像又出现了新问题

    (-1)+(-2)=(-4)?

    不过好像问题不大,因为1011(是-4的反码,但是从原码来看,他其实是-3。巧合吗?)

    我们再看个例子吧

    1110(-1)+1100(-3)=1010(-5)

    确实是巧合,看来相反数问题是解决了,但是却让两个负数相加的出错了。

    但是实际上,两个负数相加出错其实问题不大。我们回头想想我们的目的是什么?是解决做减法的问题,把减法当成加法来算。

    两个正数相加和两个负数相加,其实都是一个加法问题,只是有无符号位罢了。而正数+负数才是真正的减法问题。

    也就是说只要正数+负数不会出错,那么就没问题了。负数加负数出错没关系的,负数的本质就是正数加上一个符号位而已。

    在原码表示法中两个负数相加,其实在不溢出的情况下结果就只有符号位出错而已(1001+1010=0011)

    反码的负数相加出错,其实问题不大。我们只需要加实现两个负数加法时,将两个负数反码包括符号位全部按位取反相加,然后再给他的符号位强行置‘1’就可以了。

    所以反码表示法其实已经解决了减法的问题,他不仅不会像原码那样出现两个相反数相加不为零的情况,而且对于任意的一个正数加负数,如:
    0001(1)+1101(-2)=1110(-1) 计算结果是正确的。所以反码与原码比较,最大的优点,就在于解决了减法的问题。

    但是我们还是不满足为什么 0001+1110=1111 (1+(-1)=-0) 为什么是-0呢

    而且虽然说两个负数相加问题不大,但是问题不大,也是问题呀。好吧,处女座。接下来就介绍我们的大boss补码。

    (四)补码

    补码:正数的补码等于他的原码
    负数的补码等于反码+1。
    (这只是一种算补码的方式,多数书对于补码就是这句话)

    在《计算机组成原理中》,补码的另外一种算法 是

    负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。

    OK,补码就讲完了。再见!!

    还是莫名其妙有没有,为什么补码等于反码加1,为什么自低位向高位取反…?

    其实上面那两段话,都只是补码的求法,而不是补码的定义。很多人以为求补码就要先求反码,其实并不是。

    那些鸡贼的计算机学家,并不会心血来潮的把反码+1就定义为补码。只不过是补码正好就等于反码加1罢了。

    所以,忘记那些书上那句负数的补码等于它的反码+1。就这句话把我们带入了理解的误区。

    这就是后来我明白为什么我看的那本《计算机组成原理》,要特意先讲补码,再讲反码。

    然后说负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。

    但是上面这句话,同样不是补码的定义,它只是补码的另外一种求法。它的存在,告诉我们忘记那句该死的‘反码+1’它并不是必须的。

    如果你有兴趣了解,补码的严格说法,我建议你可以看一下《计算机组成原理》。它会用‘模’和‘同余’的概念,严谨地解释补码。

    接下来我只想聊聊补码的思想。

    (五)补码的思想

    补码的思想,第一次见可能会觉得很绕,但是如果你肯停下来仔细想想,绝对会觉得非常美妙。

    补码的思想其实就来自于生活,只是我们没注意到而已。时钟,经纬度,《易经》里的八卦。

    补码的思想其实就类似于生活中的时钟

    好吧,我其实不想用类似,好像这种词,因为类比的,终究不是事物本身。而且不严谨会让我怀疑我不是工科僧,说得好像我严谨过似的,哈哈

    如果说现在时针现在停在10点钟,那么什么时候时针会停在八点钟呢?

    简单,过去隔两个小时的时候,是八点钟。未来过十个小时的时候也是八点钟

    也就是说时间正拨10小时,或是倒拨2小时都是八点钟。

    也就是10-2=8,而且 10+10=8(10+10=10+2+8=12+8=8)

    这个时候满12说明时针在走第二圈了,又走了8小时,所以时针正好又停在八点钟。

    所以12在时钟运算中,称之为模,超过了12就会重新从1开始算了。

    也就是说, 10-2和10+10从另一个角度来看是等效的,它都使时针指向了八点钟。

    既然是等效的,那在时钟运算中,减去一个数,其实就相当于加上另外一个数(这个数与减数相加正好等于12,也称为同余数)

    这就是补码所谓模运算思想的生活例子

    在这里,我们再次强调原码,反码,补码的引入是为了解决做减法的问题。在原码,反码表示法中,我们把减法化为加法的思维是减去一个数,等于加上一个数的相反数,结果发现引入了符号位,却因为符号位造成了各种意向不到的问题。

    但是从上面的例子中,我们可以看到其实减去一个数,对于数值有限制,有溢出的运算(模运算)来说,其实也相当于加上这个数的同余数。

    也就是说,我们不引入负数的概念,就可以把减法当成加法来算。所以接下来我们聊4位二进制数的运算,也不必急于引入符号位。因为补码的思想,把减法当成加法时并不是必须要引入符号位的。

    而且我们可以通过下面的例子,也许能回答另一个问题,为什么负数的符号位是‘1’,而不是正数的符号位是‘1’。

    (六)补码实例

    好吧,接下来我们就做一做四位二进制数的减法吧(先不引入符号位)

    0110(6)-0010(2)【6-2=4,但是由于计算机中没有减法器,我们没法算】

    这个时候,我们想想时钟运算中,减去一个数,是可以等同于加上另外一个正数(同余数)

    那么这个数是什么呢?从时钟运算中我们可以看出这个数与减数相加正好等于模。

    那么四位二进制数的模是多少呢?也就是说四位二进制数最大容量是多少?其实就是2^4=16=10000B

    那么2的同余数,就等于10000-0010=1110(14)

    既然如此

    0110(6)-0010(2)=0110(6)+1110(14)=10100(20=16+4)

    OK,我们看到按照这种算法得出的结果是10100,但是对于四位二进制数,最大只能存放4位(硬件决定了),如果我们低四位,正好是0100(4),正好是我们想要的结果,至于最高位的‘1’,计算机会把他放入psw寄存器进位位中。8位机则会放在cy中,x86会放在cf中(这个我们不作讨论)

    这个时候,我们再想想在四位二进制数中,减去2,就相当于加上它的同余数14(至于它们为什么同余,还是建议看《计算机组成原理》)

    但是减去2,从另外一个角度来说,也是加上(-2)。即加上(-2)和加上14其实得到的二进制结果除了进位位,结果是一样的。

    如果我们把1110(14)的最高位看作符号位后就是(-2)的补码,这可能也是为什么负数的符号位是‘1’而不是‘0’,

    而且在有符号位的四位二进制数中,能表示的只有‘-8~7’,而无符号位数(14)的作用和有符号数(-2)的作用效果其实是一样的。

    那正数的补码呢?加上一个正数,加法器就直接可以实现。所以它的补码就还是它本身。

    下图给出带符号位四位二进制的补码表示法

    到这里,我们发现原码,反码的问题,补码基本解决了。

    在补码中也不存在负零了,因为1000表示-8

    这是因为根据上面的补码图,做减法时,0001(1)+1111(-1)=0000
    我们再也不需要一个1000来表示负0了,就把它规定为-8

    负数与负数相加的问题也解决了1111(-1)+1110(-2)=1101(-3)

    可能说得有点绕,但是实在是没办法。其实我觉得补码还可以这样画。

    很优美有没有,如果你想想地理课本,0不就相当于本初子午线,-8不就是180°,而正数相当于西经,负数相当于东经。

    (七)为何这样求补码

    然后我们再来看看为什么负数的补码的求法为什么是反码+1

    因为负数的反码加上这个负数的绝对值正好等于1111,再加1,就是1000,也就是四位二进数的模

    而负数的补码是它的绝对值的同余数,可以通过模减去负数的绝对值,得到他的补码。

    所以 负数的补码就是它的反码+1。

    有点绕吧,只能说很难算清楚,你们还是自己算算吧。还有上面我提到的另外一种算法。

    接下来,我要说一下我自己算补码的小技巧。

    看上面那个图。

    如果我们把-8当成负数的原点。那么-5的补码是多少呢?

    -5=-8+3
    -5的补码就是-8的补码加3

    1000(-8) +0011(3)=1011(-5)
    所以完全可以口算出-5的补码是1011

    当然,也可以记住-1的补码是1111口算减法得出

    对于八位加法器的话,可以把-128当补码原点。十六位可以把-32768当补码原点。

    是的,128是256(八位二进制数的模)的一半,32768是65536(十六位二进数的模)的一半

    也很方便有没有,而且简单的是

    补码原点总是最高位是‘1’,其他位是‘0’

    所以做加法总是简单得可以口算。

    OK,原码,反码,补码之旅就到这里结束。补码第一次看总会觉得很绕,想言简意赅,就怕哪里遗漏了。讲得细致,又不免连自己都觉得啰里啰嗦。谢观!

    作者:
    链接:https://www.imooc.com/article/16813?block_id=tuijian_wz
    来源:慕课网
    本文原创发布于慕课网 ,转载请注明出处,谢谢合作

    看到这里想必大家都有所收获了吧,现在我们重新回到开头的那个问题:
    2^32=4294967296,

    A=10,为无符号型,转换为二进制为0000 0000 0000 0000 0000 0000 0000 1010
    所以 ~ A的二进制位1111 1111 1111 1111 1111 1111 1111 0101即0xFFFFFFF5,
    如果转换为 int 型的话则为-11( 补码的补码就是原码),因为输出的是uint,无符号整型的范围为0~4294967295,而0xFFFFFFF5转换为无符号十进制整型执行uint b=(uint)a;转化为uint类型时,存储的依然是补码:1111 1111 1111 1111 1111 1111 1111 0101;没有符号位。

    这时值就变成了4294967285。

    第二题,发生溢出,因为有符号字符型其范围为-128~127

    127用二进制表示为:0111 1111,128表示为1000 0000,这里发生溢出,因为第一位为1,为符号位,表示负数,即-128 。

    展开全文
  • Java位运算按位运算移位运算int类型的取值范围多少? 二进制中负数怎么表示? 在进行位运算之前,先看看负数的二进制形式在计算机中如何表示的,在计算机中所有的数字都二进制补码的形式表示的,其中第一位...

    二进制中负数怎么表示?

    在进行位运算之前,先看看负数的二进制形式在计算机中是如何表示的,在计算机中所有的数字都是以二进制补码的形式表示的,其中第一位(最高位)是标志位,为0表示正数,为1表示负数,剩余的位才是用来表示数字部分的。使用补码,可以将符号位和数值域统一处理。同时,加法和减法也可以统一处理。

    原码:
    正数的原码是按照绝对值大小转换成的二进制数。
    负数的原码是按照绝对值大小转换成的二进制数,然后最高位补1表示为负数。
    反码:
    正数的反码与原码相同。
    负数的反码为该数的原码除符号位(即最高位的1)外各位取反。
    补码:
    正数的补码与原码相同;
    负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.

    在java中一个字节(byte)占8位(bit),位(bit)表示二进制中的一个数字的位置,所以8位的意思是二进制数字有8位,以byte类型为正数5的数字举例:
    5的原码为:0000 0101
    正数的反码、补码都和原码一样,所以byte类型正数5在计算机中的存在形式就是0000 0101。

    再看看byte类型负数-5在计算机中怎么表示的:
    -5的原码:1000 0101
    先求出-5的绝对值的二进制表达式为:0000 0101,再把符号位改为1,原码即为:1000 0101

    -5的反码:1111 1010
    根据-5的原码1000 0101,除了最高位符号位1不变外,其他的为0则为1,位1则为0,反码即为:1111 1010

    -5的补码:1111 1011
    根据反码1111 1010,将其+1则得到补码位:1111 1011

    所以-5在计算机中二进制形式为:1111 1011。
    如果需要根据计算负数的十进制结果为多少,则先根据补码1111 1011减1得到1111 1010,再计算其反码,0转换为1,1转换为0,最高位符号位不变,即结果为:1000 0101,这时可以根据二进制的规则得到值为:-5。

    Java位运算

    按位运算

    1. &(与)
      两位都为1,那么结果为1,可以将1看做是true,0为false,&就为java中的&符号,同为true结果才为true,那么同为1结果才是1。
      例:9 & 8
      二进制形式运算为:
      0000 1001 &
      0000 1000
      二进制结果为:0000 1000,十进制结果即为:8

    2. |(或)
      有一位为1,那么结果为1,同样可以将1看做是true,0为false,|就为java中的|符号,有一个为true结果就为true,那么有一个为1结果就是是1。
      例:9 & 8
      二进制形式运算为:
      0000 1001 |
      0000 1000
      二进制结果为:0000 1001,十进制结果即为:9

    3. ~(非)
      0变为1,1变为0
      例:~9
      9二进制形式为:0000 1001
      | 运算后十进制为:1111 0110
      此为负数,那么它的原码为补码-1,然后除符号位外,所有取反
      原码为:1000 1010
      十进制则为:-10

    4. ^(异或)
      两位不相同,结果为1
      例:9^8
      二进制形式运算为:
      0000 1001 ^
      0000 1000
      二进制结果为:0000 001
      十进制结果即为:1

    移位运算

    1. << (左移)
      各二进制位全部左移N位,高位丢弃,低位补0
      例:9<<2
      9的二进制形式为:0000 1001
      左移两位后:0010 0100
      十进制则为:36

    2. (右移) > >
      各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1
      例:9>>2
      9的二进制形式为:0000 1001
      右移两位后:0000 0010
      十进制则为:2

    4.(无符号右移) > > >
    各二进制位全部右移N位,无论正负,都在高位插入0
    例:9>>>2
    9的二进制形式为:0000 1001
    无符号右移两位后:0000 0010
    十进制则为:2

    int类型的取值范围是多少?

    int类型占4个字节(byte),一个字节(byte)为8位(bit),所以int类型数字的格式如下:
    00000000 00000000 00000000 00000000

    正数的情况下,最高位必须为0,所以int类型二进制最大能表示的数为:
    01111111 11111111 11111111 11111111
    那么正数最大数是 231-1,

    负数的情况下,最高位必须为1,所以int类型二进制最大能表示的数为:
    原码:11111111 11111111 11111111 11111111
    补码:1000000 0000000 0000000 0000001
    所以这里看起来和正数情况是一样的,最小值为-231+1,那位什么负数是-231呢?

    正数0的二进制为:
    原码:00000000 00000000 00000000 00000000
    负数0的二进制为:
    原码:10000000 00000000 00000000 00000000

    0的表示形式只需要一种就够了,所以就将负数0拿来表示最小的负数-231

    展开全文
  • Java位运算按位运算移位运算int类型的取值范围多少?二进制中负数怎么表示?在进行位运算之前,先看看负数的二进制形式在计算机中如何表示的,在计算机中所有的数字都二进制补码的形式表示的,其中第一位...
  • 十进制转二进制

    2012-10-26 19:49:23
    十进制转二进制32位输出: 我个人觉得这样的。任何数存入计算机都在...因此,只要按位取出即某个数的二进制形式。此法对于负数也可。 #include int main() { int x,i; scanf("%d",&x); for(i=31;i>=0
  • 这几周笔者几篇文章介绍了改补码二进制的文章. 关联文章的地址 数值的补码表现也分两种情况: (1)正数的补码:与原码雷同。 例如,+9的补码00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码...
  • 1、什么是位运算?...而位运算就是直接在二进制的数字序列上进行按位与,按位或,按位异或,左移,右移这几种操作。 由于计算机内部本身就是以二进制在运算,所以位运算相较算数运算符来说,计算起来就...
  • 1、十进制负数转二进制假设有一个int类型的数,值为5,那么,我们知道它在计算机中表示为:(因为java中int4个字节,所以高位需要补0,占够32)00000000000000000000000000000101现在想知道,-5在计算机中如何表示...
  • 目录基础思想篇1 二进制1.1 什么是二进制1.2 计算机为什么使用二进制1.3 二进制操作1.3.1 移位操作1.3.2 逻辑操作 基础思想篇1 二进制 1.1 什么是二进制 1.2 计算机为什么使用二进制 1.3 二进制操作 1.3.1 ...
  • 负数的二进制

    2020-06-04 05:00:40
    5转换成二制101,不过int类型的数占用4字节(32位),所以前面填了一...反码:将二进制按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将00000000 0
  • 二进制反码运算

    万次阅读 2016-10-13 22:13:55
    最近在看计算机网络的相关知识,看到了运输层相关的知识,看到UDP检验和然而...号位1,然后正数的反码和补码都和原来一样,而负数的反码符号位不变,其他按位取反,补码在反码的基础上加1. 例如:18的二进制
  • 5转换成101,不过int类型的数占用4字节(32),所以前面填了一堆0。 现在想知道,-5在计算机中如何表示?   在计算机中,负数以其正值的补码形式表达。 什么叫补码呢?这得从原码,反码说起。   原码:一...
  • 关于16进制到二进制的转换

    千次阅读 2015-03-27 10:13:40
    最近偶然间遇到了一个小问题 关于16进制到二进制的转换,例如16进制 的17A 取反加1(按位取反)暂不讨论此题,文章最后会有分析。  1. 先看看16进制到2进制的转换  16#到2#制的转换:  a).要想明白16进制到2...
  • 进制

    2019-02-21 14:49:48
    1.二进制的由来 ...2.1.什么是二进制 2.2.二进制怎么表示一个数 权展开 2.3.计算机为什么要使用二进制   3.进制转换   4.运算 4.1.二进制运算优点 有些情况下复杂的运算指令,机...
  • 负数的二进制表示

    2017-09-14 11:01:06
    5转换成二制101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 现在想知道,-5在计算机中如何表示? 在计算机中,负数以其正值的补码形式表达。...反码:将二进制按位取反,所得的新二进制
  • 关于float类型在计算机中的表示形式,我参照[link1]...从输出结果看出,指数二进制表示为10111011相当于十进制的187,187-127=60,确实能表示2^60,但是为什么输出之后就出错了呢?
  • 一个数在计算机中的二进制表示形式 第一位符号位(0为正数,1为负数) 反码: 负数反码:符号位不动,按位取反 正数补码:和原码相同 补码 负数补码:符号位不动,反码加1 正数补码:和...
  • 计算机中的进制转换

    2020-06-24 12:53:06
    一、简介 在计算机中,所有的数据在计算机底层都二进制的形式存储的。二进制数据,无论正数,还是负数,都以补码的方式进行存储。 1)涉及的概念: 什么是...反码除符号位外,其余位对原码按位取反,最高位符号
  • 1.负数的二进制表示方法 在计算机中,负数以其正值的补码形式表达。 什么叫补码呢?这得从原码,反码说起。...反码:将二进制按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为
  • 按位什么什么一直我触及不到的地方,今天遇到的这个题真是长见识了 15. 二进制中 1 的个数 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 我已经把补码忘却了就去查了一下 正数的原码、反码...
  • 在计算机中,负数以其正值的补码形式表达。 什么叫补码呢?...反码:将二进制按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将00...
  • |疑惑最近在学习Python的过程中了解到位...那么上面那句话有两个关键词,我们先来看看"二进制数"|二进制按位取反位运算符,而位运算符应用在两个数的运算上,会对数字的二进制所有位数进行从低到高的运算。...
  • 1,结果就是0,因为二进制计算10&amp;01就是00嘛。 n&amp;n-1做了什么 我们举个例子,假设n = 10,n的二进制为1010,n - 1即9,二进制为1001,此时我们再用1010&amp;1001,结果就是1000,然后就发...
  • 进制转换

    2019-10-04 15:30:15
    计算机的存储器(DRAM、SRAM、Flash、硬盘)和运算器全都基于二进制工作,所以本身的数据应该是二进制。但是,二进制表示数据太没效率,一个32的整数就要写成0000 0000 0000 0000 0000 0000 0000 0011,不方便...
  • 这门课尝试用另一种方式——相对于国内用原码反码补码的数电体系(后面就用这个简称了)——解释计算机如何用二进制表示有符号数。问题产生于他讲的这个案例:-(-2147483648)。 讲到这里我很想骂娘,因为有一万个...
  • 十六进制&运算

    千次阅读 2019-04-28 07:49:28
    关于按位与运算,先要将其他的进制数转化为二进制数,然后计算 ox80转化为二进制就是10000000 比如a是十进制数15,转化为二进制数就是 00001111 10000000 上下比较没有相同的位,结果就为0 刚刚查了sbuf,原来是什么...
  • 5的二进制表示0101(补齐4) 7的二进制表示0111(补齐4) 那么5&7=多少呢? 这里给大家普及一下与计算的规则: 参与运算的两个数均以补码出现 只有对应的两个二进位都为1时,结果才为1 上面提到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 427
精华内容 170
关键字:

二进制按位计算是什么