1.计算机中的二进制与位运算
首先看看 原码, 反码, 补码是如何定义的
最高位为符号位,0表示正数,1表示负数。
原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,
正数的原码,反码 和补码相同,这里主要分析负数;
负数原码 = 绝对值的二进制数,最高位补1
负数反码 = 原码,除符号位,按位取反
负数补码 = 反码+1
例如:
6:
6的原码: 00000000 00000000 00000000 00000101
6的反码: 00000000 00000000 00000000 00000101
6的补码: 00000000 00000000 00000000 00000101
-6:
-6的原码: 10000000 00000000 00000000 00000101
-6的反码: 11111111 11111111 11111111 11111010 (原码,除符号位,按位取反)
-6的补码: 11111111 11111111 11111111 11111011 (反码+1)
2.计算机是如何进行算数运算的
1、正数没有列外,在计算机中以原码标识
2、负数不同了,在计算机中,负数以原码的补码形式表达。
3、java提供的位运算符:
左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
左移 <<
左边的二进制丢弃,右边补0
对于正数而言,左移 n 相当于乘以2的n次方(但效率比乘法高)。
6<<1 = 6 * 2^1
6<<2 = 6 * 2^2
6<<3 = 6 * 2^3
6<<4 = 6 * 2^4
右移 >>
正数左补0,负数左补1.
对于正数而言,右移 n 相当于除以2的n次方(但效率比除法高)
6>>1 = 6 / 2^1
6>>2 = 6 / 2^2
6>>3 = 6 / 2^3
6>>4 = 6 / 2^4
无符号右移 >>>
无论正数,还是负数,左边补0
位与( & )
都为1 ,才为1
位或( | )
都为0,才为0
位异或( ^ )
同为0,异为1
不进位加法。
位非( ~ )
取反