位运算符
位运算是对操作数以二进制为单位进行的操作和运算,运算结果为整数。位运算符号包括:“&”、“|”、“~”、“^”和位移运算符“>>”、“<<”、“>>>”7个位运算符
对于二进制要注意的点
例:int a = 5,b = -7 。int数据类型占用4个字节,每个字节对应8个二进制位
a对应的二进制数原码为:00000000 00000000 00000000 00000101
b对应的二进制数原码为:10000000 00000000 00000000 00000111
二进制的高位是符号位:0表示正数、1表示负数。
正数的原码,反码,补码都一样(所以正数不用区分码类型,三码合一)
负数的反码=它的原码符号位不变,其它位取反,即0改为1,1改为0
负数的补码=它的反码+1
0的反码、补码都是0
注意在计算机运算的时候,都是以补码的形式来运算的(运算时看补码)
得出运算数看结果时,要看其对应的原码(结果看原码)
二进制进行算法,向上借位时,借1位数为2
一、&(按位与)
按位与运算符号“&”,其参与运算的数字,低位对其,高位不足的补0,两个数对应的二进制位都为1时,结果才为1,否则为0,可看出任何数与0按位与运算,其结果都为0
口诀:全为1,结果为1,否则都为0
例如:7&3
详解:
7和3默认为int类型,因为两个数都是正数,所以,原码、反码、补码都一样
运算时看补码,结果看原码
• 7的补码:00000000 00000000 00000000 00000111
• 3的补码:00000000 00000000 00000000 00000011
• &后结果:00000000 00000000 00000000 00000011
• 得出结果为3
二、| (按位或)
口诀:有一个为1,结果就为1,否者都为0
例如:-6|3
• -6的原码:10000000 00000000 00000000 00000110
• -6的反码:11111111 11111111 11111111 11111001
• -6的补码:11111111 11111111 11111111 11111010
• 3的补码: 00000000 00000000 00000000 00000011
• |后的结果:11111111 11111111 11111111 11111011
• |后的反码:11111111 11111111 11111111 11111010
• |后的原码:10000000 00000000 00000000 00000101
• 得出结果为-5
三、~ (按位取反)
口诀:是1为0,是0为1
例如:~5
5的补码 00000000 00000000 00000000 00000101
~后补码 11111111 11111111 11111111 11111010
~后反码 11111111 11111111 11111111 11111001
~后原码 10000000 00000000 00000000 00000110
~后结果 -6
四、^ (按位异或)
口诀:相等为0,不等为1
例如:4^5
4的补码 00000000 00000000 00000000 00000100
5的补码 00000000 00000000 00000000 00000101
^后补码 00000000 00000000 00000000 00000001
^后原码 00000000 00000000 00000000 00000001
^后结果 1
五、>> (算数右移)
口诀:低位溢出(舍弃),符号位不变,并且用符号位数字补齐空位
java中整数右移n位,相当于除以n次2,或者是除以2的n次幂(且向左取整)
例如:7>>2 -5>>2
7的补码 00000000 00000000 00000000 00000111
>>后补码 00000000 00000000 00000000 00000001
>>后结果为 1
-5的原码 10000000 00000000 00000000 00000101
-5的反码 11111111 11111111 11111111 11111010
-5的补码 11111111 11111111 11111111 11111011
>>后补码 11111111 11111111 11111111 11111110
>>后反码 11111111 11111111 11111111 11111101
>>后原码 10000000 00000000 00000000 00000010
>>后结果为 -2
六、<<(算数左)
口诀:符号位不变,高位舍弃,低位补0
左移n位相当于乘以n次2或者是2的n次幂
例如:3<<2 -6<<2
3的补码 00000000 00000000 00000000 00000011
<<后补码 00000000 00000000 00000000 00001100
<<后结果为 12
-6的原码 10000000 00000000 00000000 00000110
-6的反码 11111111 11111111 11111111 11111001
-6的补码 11111111 11111111 11111111 11111010
<<后补码 11111111 11111111 11111111 11101000
<<后反码 11111111 11111111 11111111 11100111
<<后原码 10000000 00000000 00000000 00011000
<<后结果为 -24
七、>>>(无符号右移)
口诀:低位溢出(舍弃),高位补0(无论正负都补0)
例如:-10>>>3 7>>>3
-10原码 10000000 00000000 00000000 00001010
-10反码 11111111 11111111 11111111 11110101
-10补码 11111111 11111111 11111111 11110110
>>>后补 00011111 11111111 11111111 11111110 (为正数,原、反、补码都一样)
>>>后结果为 536870910
7的补码 00000000 00000000 00000000 00000111
>>>后 00000000 00000000 00000000 00000000
>>>后结果为 0
总结
&(按位与): 全为1时为1,否则为0
| (按位或):有一个为1则为1,否则为0
~ (按位取反):是1为0,是0为1
^ (按位异或):相等为0,不等为1
>> (算数右移): 低位舍弃,符号位不变,高位补符号位数字
<<(算数左):高位舍弃,符号位不变,低位补0
>>>(无符号右移):低位舍弃,整体向右移动,且高位补0(无论正负)