摘要:位运算和无符号位运算对于负数而言,普通位运算已然保持了符号位,而是将真值部分进行位运算。大数向小数的溢出问题直接进行位运算,默认输出值的类型为等小数将会自动扩充成进行位运算,则使用位位运算。
原码、反码和补码
一个数可以分成符号位(0正1负)+ 真值,原码是我们正常想法写出来的二进制。由于计算机只能做加法,负数用单纯的二进制原码书写会出错,于是大家发明了反码(正数不变,负数符号位不变,真值部分取反);再后来由于+0, -0的争端,于是改进反码,变成补码(正数不变,负数符号位不变,真值部分取反,然后+1)。二进制前面的0都可以省略,所以总结来说:计算机里的负数都是用补码(符号位1,真值部分取反+1)表示的。
位运算和无符号位运算
对于负数而言,普通位运算已然保持了符号位1,而是将真值部分进行位运算。但要注意对于负数的位运算操作是建立在补码上的(补码运算,得到补码结果,将补码结果转换为普通的10进制数结果),所以就会出现-15 >> 1 得到的是-8 而不是 -7.而无符号位运算则是将负数的补码整个一起位移,并且高位补0,这就意味着将高位符号位补0变成了正数,所以最后往往得到一个很大的值,即Integer.MAX_VALUE - x.x为该负数的绝对值进行位运算后得到的结果。
大数(long 64,int 32)向小数(short 16,byte 8)的溢出问题
直接进行位运算,默认输出值的类型为int.short, byte等小数将会自动扩充成int进行位运算,long则使用64位位运算。如果强制大数向小数转换,就会出现溢出,原大数真值中的1变成了小数里代表符号位的1而成为了负数。
最后就是位运算在刷题里遇到的不多,有时候那种纯数字的问题不能用乘法除法的话就可以考虑位运算了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67587.html
摘要:原码补码和反码原码一个数在计算机中是以二进制的形式存在的,其中第一位存放符号正数为负数为。中的位运算在中按位操作符会将其操作数转成补码形式的有符号位整数。原文链接由扯到中的位运算 这个话题的由来是2016年3月份的时候 NPM 社区发生了‘left-pad’事件,不久后社区就有人发布了用来补救的,也是现在大家能用到的 left-pad 库。 最开始这个库的代码是这样的。 module....
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
摘要:虽然在内部,数值都是以位浮点数的形式储存,但是做位运算的时候,是以位带符号的整数进行运算的,并且返回值也是一个位带符号的整数。如下表应用场景取整对于一般的整数,返回值不会有任何变化。例如,结果为负数存储采用的形式是二进制补码。 什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并...
阅读 2047·2023-04-26 02:41
阅读 2108·2021-09-24 09:47
阅读 1506·2019-08-30 15:53
阅读 1166·2019-08-30 13:01
阅读 1855·2019-08-29 11:27
阅读 2824·2019-08-28 17:55
阅读 1703·2019-08-26 14:00
阅读 3317·2019-08-26 10:18