java位运算小结

关于位运算符:
按位非~:0取1,1取0
符号位也参与位运算
位运算的结果求原码时要看符号位来求。
例1:~10
0000 0000 0000 0000 0000 0000 0000 1010 10的原码
0000 0000 0000 0000 0000 0000 0000 1010 10的反码
0000 0000 0000 0000 0000 0000 0000 1010 10的补码
1111 1111 1111 1111 1111 1111 1111 0101 按位非运算结果(取反包括符号位)
1111 1111 1111 1111 1111 1111 1111 0100 因为符号位是1,所以取反码-1
1000 0000 0000 0000 0000 0000 0000 1011 取到原码输出整型返回值是-11
例2:~-10
1000 0000 0000 0000 0000 0000 0000 1010 -10的原码
1111 1111 1111 1111 1111 1111 1111 0101 -10的反码
1111 1111 1111 1111 1111 1111 1111 0110 -10的补码
0000 0000 0000 0000 0000 0000 0000 1001 按位非运算结果(取反包括符号位)
0000 0000 0000 0000 0000 0000 0000 1001 因为符号位是0,所以取反码原码就是这个
, 取到原码输出整型返回值是9。
按位与&:按位比较两个数的二进制,都是1返回1,其余返回0。
按位或|:按位比较两个数的二进制,都是0返回0,其余返回1。
按位异或^:按位比较两个数的二进制,相同返回0,不同返回1。
以上位运算符全部遵循:先转补码在进行位运算, 符号位也参与位运算,位运算的结果当成补码反向求原码再转整型数值就是返回值了。(注意求补码先看符号位再决定求补码的方式)

左移<<:二进制数向左位移
先转成补码再左移运算,得到的值当成补码求原码。
左移过程中会把符号位也当普通数值位移(即符号位参与左移)
例1:255<<24 左移24位
0000 0000 0000 0000 0000 0000 1111 1111 255的原码
0000 0000 0000 0000 0000 0000 1111 1111 255的反码
0000 0000 0000 0000 0000 0000 1111 1111 255的补码
1111 1111 0000 0000 0000 0000 0000 0000 左移24位之后的值(注意最高位符号位0也被位移了,左移会把符号位当成普通数值操作,左移超过int32位的数值将被直接舍弃)
1111 1110 1111 1111 1111 1111 1111 1111 把左移的值当成补码来算反码,因为左移后的最高位符号位已经变成1是负数了,所以算反码就应该-1来计算(这里是要看符号位来算反码原码的)
1000 0001 0000 0000 0000 0000 0000 0000 继续求反得出原码,此时再转十进制就是返回值-16777216
255<<24=-16777216
例2:-255<<24 左移24位
1000 0000 0000 0000 0000 0000 1111 1111 -255的原码
1111 1111 1111 1111 1111 1111 0000 0000 -255的反码
1111 1111 1111 1111 1111 1111 0000 0001 -255的补码
0000 0001 0000 0000 0000 0000 0000 0000 左移24位的结果(符号位参与)
0000 0001 0000 0000 0000 0000 0000 0000 取原码发现符号位位移后是0,所以三码合一,原码转整型得返回值16777216
总结:左移时符号位当普通数值左移,求原码要看符号位来求。

右移>>:二进制数向右位移,但是和左移不一样,>>右移时符号位是不参与的,会留在原位。
例-10>>1:-10的补码最高位符号位是1 ,但不同于左移>>右移过程中符号位不参与,所以位移后最高位符号位依然是1,然后计算原码是就要-1取反。

右移>>>:二进制数向右位移,和左移一样,>>>右移时符号位是参与的,符号位和左移一样被当成普通数值计算
例:-10>>>1:-10的补码最高位符号位是1,与左移一样>>>右移时符号位参与计算,所以右移后最高位是0 ,计算原码就是三码合一等于补码。

总结:左移<<和右移>>>运算时符号位参与计算,右移>>时符号位不动(位运算中除>>外,其他位运算符号位都是参与计算的!)
位运算产生的值当补码求原码时要注意符号,不同符号取反码方式不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值