二进制概念
在讲解这几个运算符号前,先聊聊计算机的二进制和原码,反码,补码这几个概念。二进制是计算机广泛使用的一种数制,二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。而且计算机都是保存二进制的补码值。
原码
- 正数:
原码是其二进制的表现形式 - 负数
原码是其数值的绝对值的形式
5->00000101
-5->|-5|->00000101
反码
-
正数:
正数的反码是其本身 -
负数:
反码是其原码除符号位,其他位取反的值
5->00000101
-5->|-5|->00000101->00000010
补码
- 正数:
正数的补码是其本身 - 负数:
负数的补码是其反码+1的值
5->00000101
-5->|-5|->00000101->00000010->00000011
二进制加法规则:
0 + 1 = 1;0 + 0 = 0; 1 + 1 = 10(则就是类似数学的进位),例如:
001 + 1 ->
00000001
+
00000001
=00000010(从右向左计算,1+1 = 10 向第二位进了1)
有了以上的基础知识,我们就可以开始讲一下&,|,~和移位运算符了,拭目以待!
&运算符
&运算符也称为按位与,通过把两个数值计算成二进制来计算,当两者都是1时等于1,否则其他情况等于0。
让我们分析一下这个案例---->:
System.out.println(5 & 6); //这个结果会是什么呢?大家可以计算一下
首先Java会把5和6分别计算出其二进制,然后按位&计算--->
5->00000101
6->00000110
&
00000100-->转成十进制就是4了
答案是:4
| 运算符
| 运算符也称为或运算符,按位或,通过二进制按位或,当两者中的一个为1时等于1,否则为0
还时分析案例---->:
System.out.println(12 | 3);
先把12和3的二进制计算出来:
12->00001100
3 ->00000011
|
00001111-->转成十进制就是15
答案是:15
~运算符
~运算符也称为非运算符,通过对二进制按位取反,即0变成1,1变成0。
案例---->:
System.out.println(~5);
还是先计算它的二进制:
5->00000 101
~
11111 010(注意:这个是补码,因为5是正数补码就是其二进制本身)
我们需要的是原码,所以需要从补码反推到原码:
补码-1得到其反码:
11111 010-00000001=111111 001
反码按位取反得到原码:
10000 110->换算成十进制就是-6
所以答案是:-6(正数的非运算会是负数)
^运算符
^运算符又称为异或运算符,按位异或二进制,两者数值相同时等于0,否则等于1。
0 : 0 = 0;0 :1 = 1; 1:1=0
System.out.println(5 ^ 10); //15
00000101
^
00001010
=
00001111
答案是:15
>>运算符
右移运算符,这个左右移运算符我印象最深的是,左移乘以2的移动次方,右移除以2的移动次方,但是底层是通过二进制移动得出结果的。
System.out.println(5 >> 2);
//其实可以通过5 / 2^2 = 1
5的二进制是:00000101
通过对二进制整体右移两位得到:00000001(其实你会发现,相当于最后的1后面是一堵墙,右移两位把01隐藏在了墙面后,所以只能看到00000001)-->1
答案是:1
<<运算符
左移运算符
System.out.println(5 << 2);
//5的二进制是:00000101,对二进制整体左移两位得到:00010100-->20
或许会疑惑,为什么是00010100,在不补位的情况分析一下,
不补位的二进制是101,整体移动两位得到:101 00(00移动两位了你总得补位吧,
不补位谁知道你移动了两位是吧?那再补最高位0就是00010100了)
答案是:20
<<和>>运算符是一个有符号移动符,也就是说正数最高位补的是0,负数最高位补的是1。Java还有一个无符号右移运算符>>>其实和>>就是前者无符号右移,后者有符号右移的区别。
总结:好了,符号运算符的二进制运算讲解完成了,希望能帮助一下下大家!!!每天成长一点,前途依旧是我看到的那样。