Java中的位运算符

位运算符

位运算是对操作数以二进制为单位进行的操作和运算,运算结果为整数。位运算符号包括:“&”、“|”、“~”、“^”和位移运算符“>>”、“<<”、“>>>”7个位运算符

对于二进制要注意的点

例:int a = 5,b = -7 。int数据类型占用4个字节,每个字节对应8个二进制位

a对应的二进制数原码为:00000000 00000000 00000000 00000101

b对应的二进制数原码为:10000000 00000000 00000000 00000111

  1. 二进制的高位是符号位:0表示正数、1表示负数。

  1. 正数的原码,反码,补码都一样(所以正数不用区分码类型,三码合一)

  1. 负数的反码=它的原码符号位不变,其它位取反,即0改为1,1改为0

  1. 负数的补码=它的反码+1

  1. 0的反码、补码都是0

  1. 注意在计算机运算的时候,都是以补码的形式来运算的(运算时看补码)

  1. 得出运算数看结果时,要看其对应的原码(结果看原码)

  1. 二进制进行算法,向上借位时,借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时为1,否则为0

  1. | (按位或):有一个为1则为1,否则为0

  1. ~ (按位取反):是1为0,是0为1

  1. ^ (按位异或):相等为0,不等为1

  1. >> (算数右移): 低位舍弃,符号位不变,高位补符号位数字

  1. <<(算数左):高位舍弃,符号位不变,低位补0

  1. >>>(无符号右移):低位舍弃,整体向右移动,且高位补0(无论正负)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值