Java位运算符
- 包括:& 、 | 、 ~ 、 ^ 、 << 、 >> 、 >>> 。
-
& 表示同一位上两个都为1,则结果为1。如“ 1101 & 1001”的结果是“1001”。
-
| 表示同一位上两个只要有一个为1,则结果为1。如“ 1101 & 1001”的结果是“1101”。
-
~ 表示取反,如“ ~1101”的结果是“0010”。
-
^ 表示异或,同一位上两个不一样,则该位结果为1,反之为0,如“ 1101 ^ 1001”的结果是“0100”。
- << 表示左移,整体向左移动,即向高位移动,以2的几何级数增长。
- ‘>>’ 表示左移,整体向右移动,即向低位移动,以2的集合级数下降。
- '>>>'表示无符号右移,具体见下面.。
详细说明位运算过程(需要了解补码知识,见本文最后):
<<表示左移移,不分正负数,低位补0;
注:以下数据类型默认为byte-8位
左移时不管正负,低位补0
正数:r = 20 << 2
20的二进制补码:0001 0100
向左移动两位后:0101 0000
结果:r = 80
负数:r = -20 << 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
左移两位后的补码:1011 0000
反码:1010 1111
原码:1101 0000
结果:r = -80
’>>’ 表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
注:以下数据类型默认为byte-8位
正数:r = 20 >> 2
20的二进制补码:0001 0100
向右移动两位后:0000 0101
结果:r = 5
负数:r = -20 >> 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
右移两位后的补码:1111 1011
反码:1111 1010
原码:1000 0101
结果:r = -5
’>>>'表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
-20:源码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
补码:
一、计算机中整数如何表示
计算机中用二进制表示数据。
有符号数是由符号位+数字位表示,无符号数是由数字位表示。
有符号数的最高位是符号位,为1表示该二进制数为负数,为0表示该二进制数为正数。
char 2个字节 0~65535 无符号数
short 2个字节 -32767~32766 有符号数
二、原码 反码 补码
原码
作用:计算机中对数字的二进制定点表示方法
表示:正数为原二进制数,负数为绝对值的二进制的最高位(符号位)为1
缺点:1. 计算机中进行正负值运算时,可能出错(1-(-1)=-2)
2. 正负0之分
反码
作用:解决了正负值计算问题
表示:正数反码为原码,负数则是符号位不变,其余都取反(0->1,1->0)
缺点:
正负0之分
补码
作用:解决了正负0问题([+0]补=[+0]反=[+0]原=00000000,[-0]补=11111111+1=00000000。)
利用最高位溢出,将减法运算转为加法运算(a+(-b) = c)
表示:正数的补码为原码,负数为反码末位+1
小结:
计算机中数值一律用补码表示和存储
正数的原码、反码、补码都是相同的(二进制表示)
注意:反码 与 取反 有区别。
三、计算机存储和计算为什么用补码