谈谈Java的&,|,~,^,>>,<<运算符

二进制概念

在讲解这几个运算符号前,先聊聊计算机的二进制和原码,反码,补码这几个概念。二进制是计算机广泛使用的一种数制,二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。而且计算机都是保存二进制的补码值。

原码

  1. 正数:
    原码是其二进制的表现形式
  2. 负数
    原码是其数值的绝对值的形式
5->00000101
-5->|-5|->00000101

反码

  1. 正数:
    正数的反码是其本身

  2. 负数:
    反码是其原码除符号位,其他位取反的值

5->00000101
-5->|-5|->00000101->00000010

补码

  1. 正数:
    正数的补码是其本身
  2. 负数:
    负数的补码是其反码+1的值
5->00000101
-5->|-5|->00000101->00000010->00000011
二进制加法规则:
0 + 1 = 10 + 0 = 0; 1 + 1 = 10(则就是类似数学的进位),例如:
001 + 1 ->
 00000001
+
 00000001
=00000010(从右向左计算,1+1 = 10 向第二位进了1)

有了以上的基础知识,我们就可以开始讲一下&,|,~和移位运算符了,拭目以待!

&运算符

&运算符也称为按位与,通过把两个数值计算成二进制来计算,当两者都是1时等于1,否则其他情况等于0。

让我们分析一下这个案例---->:
System.out.println(5 & 6); //这个结果会是什么呢?大家可以计算一下

首先Java会把56分别计算出其二进制,然后按位&计算--->
5->00000101
6->00000110
&
00000100-->转成十进制就是4

答案是:4

| 运算符

| 运算符也称为或运算符,按位或,通过二进制按位或,当两者中的一个为1时等于1,否则为0

还时分析案例---->:
System.out.println(12 | 3);

先把123的二进制计算出来:
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 0000移动两位了你总得补位吧,
不补位谁知道你移动了两位是吧?那再补最高位0就是00010100了)

答案是:20
<<和>>运算符是一个有符号移动符,也就是说正数最高位补的是0,负数最高位补的是1。Java还有一个无符号右移运算符>>>其实和>>就是前者无符号右移,后者有符号右移的区别。

总结:好了,符号运算符的二进制运算讲解完成了,希望能帮助一下下大家!!!每天成长一点,前途依旧是我看到的那样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值