java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)
位运算种类
~:按位取反
&:位与
|:位或
^:异或
<<:左移
>>:右移
>>>:逻辑右移
注意这里没有<<<运算符
准备工作
位运算要求我们要把十进制转换成二进制来进行相关计算,
而且要知道计算机在算二级制数的时候,会把两数转换成补码来进行计算,结果也是以补码的形式存在的正数补码等于原码,负数补码等于原码的反码+1(这个很重要)
如果不了解原码反码补码请参考我的另一篇博客原码,反码补码详解
各运算符详解
(1)~:按位取反
举个例子~7
我们把7写成二进制就是:00000111
按位取反就是把0变成1,1变成0
即:
00000111
~
——————
11111000
既然是补码且最高位为1,那么结果必定为负数,那么就要把它变成原码再转换成十进制
要求原码先求反码(反码=补码-1)
即:
11111000
-1
——————
11110111
原码就为:
11110111
——————
10001000
符号位不变
最后把二进制转换成二进制就得到了-8
所以~7=-8;
(2)&:位于
举个例子5&(-7)
首先一样的把两者都写成二进制
5:00000101
-7:10000111
位于就是都为1则结果是1,其他情况都是0
由于-7需要转换成补码所以参与运算的实际上是11111001
即:
00000101
&
11111001
——————
00000001
补码结果是00000001为正数所以原码等于补码
故转换成十进制为:1
所以5&(-7)=1
(3)|:位或
举个例子6|4
化成二进制:
6:00000110
4:00000100
位或就是二者只要有一个为1结果就是1
即:
00000110
|
00000100
——————
00000110
补码结果是00000110为正数所以原码等于补码
转换成十进制为6
即6|4=6
(4)^:异或
举个例子8^(-3)
转化成二级制
8:00001000
-3:10000011
异或就是相同为0不同为1
-3参与运算的补码为11111101
即:
00001000
^
11111101
——————
11110101
补码为11110101
那么原码就是10001011
转换成十进制就为-11
即8^&(-3)=11
(6)<<:表示左移,不分正负数,低位补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
(7)>>: 表示右移,如果该数为正,则高位补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
(8)>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
注:以下数据类型默认为int 32位
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
-20原码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
>>这里的-20要写成32位的而不写成8位,是因为上边写成8位和32结果没差别,博主为了使运算简洁就写成了8位但是这里的32位对结果都要影响所以就不能简写成8位
总结
以上是生活随笔为你收集整理的java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: JDK,JRE和JVM三者的关系以及ja
- 下一篇: 正儿八经的详细讲java内部类