在学习java语言中,包括其他一些高级语言,都会涉及到二进制运算的问题,但可能在当时能相通以后由于时间的增长,又不知不觉的给忘记了,所以在这贴出我总结出的二进制运算笔记技巧,方便同鞋们学习。
在java中关于二进制运算涉及到的运算符有两种,一种是位运算,另一种是位移运算。
前者包括&、|、^、~后者包括<<、>>、>>>
在说这些运算符之前,首先应了解二进制的原码、反码、补码,概括的总结就6句话:
1,二进制最高位是符号位,0表示正数,1表示负数。
2,正数的原码、反码、补码都一样。
3,负数的反码=它的原码符号位不变,其他位取反。
4,负数的补码=它的反码+1
5,0的反码,补码都是0
6 , 在计算机运算的时候,都是以补码方式来运算的
在这六条中,最重要的不是1,2,3,4,5条,而是第6条,为什么呢?因为在没了解原码、反码、补码的同鞋学二进制运算时,第一感觉就是觉得把数换成二进制然后再运算就完了,熟不知其实是在运算的时候是要将数字的二进制换成补码来计算的,正数很好说,因为它的原码、反码、补码都是一样的,关键是负数,举例说明:
计算~5的值。
首先将求出5的补码:
原码、反码、补码都一样所以补码为: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
取反以后:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0
注意这里的取反是用补码的形式来计算的,所以计算后的结果也是补码的形式存在的,所以要从补码逆推到原码。首先注意到该补码的首位为1,说明它的原码为负数,所以按照负数求原码、反码、补码的顺序逆推便可:
补码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0(即上)
反码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 (即在原来的基础上减1)
原码:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 (符号位不变,其他取反)
所以值为:-6
其他位运算符也同理(&、^、|)
位移运算符也按补码移位的,但正数负数的移位不同,正数右移时,高位补0即可,负数右移时,符号位不变,高位用符号位补全:
-5>>2
原码:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
反码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0
补码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
右移两位后:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
反码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
原码:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
即-2
算术右移>>>就是符号位变为无符号的,在此就不多讲了。
|