java位运算符总结

java位运算符

位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。

如果操作的对象是charbyteshort,位移动作发生前其值会自动晋升为int,运算结果也为int~ 按位取反 先把10进制的整数,转为2进制,然后,每一位取反,01,10

例如:
int a = 10;
System.out.println(~a);
(注意:int类型占四个字节,每个字节占八位)
00000000 00000000 00000000 00001010 10的二进制
11111111 11111111 11111111 11110101 取反 源码
 (因为计算机内部对负数的储存机制是这样,反码再补码,最后储存补码)
10000000 00000000 00000000 00001010 反码
10000000 00000000 00000000 00001011 补码(反码+1) 最终的结果 -11

注意:
是按位取反运算,与反码是不同的,
反码法规定,正数原反补码相同,负数的反码为原码除符号位以外取反。

而按位取反运算中:
正数取反是先将初始数值转换成二进制数(6==00000110),
再对二进制数的每一位取反:即将0变为1、将1变为0。(00000110==11111001),
得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,
(此处一种逆着算为11111001-1除符号位全取反10000111即为-7,
另一种为11111001==10000110+1==10000111也为-7)就能得到计算结果。

负数取反:先将初始数值转换成二进制数(以-6为例,10000110),
再取得二进制数的补码(10000110==11111001+1==11111010),
之后对补码的每一位取反:即将0变为1、将1变为011111010==00000101即为5)。
得到的是最终结果的补码(由于正数的原码、反码、补码相同,该数即为原码),
要转换为最终结果的原码则需再次取补码,就能得到计算结果。

注:在计算机中,运算都是通过补码进行计算的

& 按位与(AND) 10&11 当上下2位都是1的时候,结果为1,其余都为0
| 按位或(OR) 10|11 当上下2位都是0的时候,结果为0,其余都为1
^ 按位异或(相同为0相异为1) 10^11

>> 右移;左边空位补最高位即符号位 实际就是除以2的操作,右移几位,除以几次

System.out.println(-10>>3);
10000000 00000000 00000000 00001010 源码
11111111 11111111 11111111 11110101 反码
11111111 11111111 11111111 11110110 补码
11111111 11111111 11111111 11111110 移位后的源码
(因为此时是为负数,所以又需要进行反码、补码操作)
10000000 00000000 00000000 00000001 移位后的反码
10000000 00000000 00000000 00000010 移位后的补码

<< 左移;右边空位以补0 实际就是2乘以2的操作,左移几次,乘以几次

>>> 无符号右移,左边空位补0
System.out.println(-10>>>3);
10000000 00000000 00000000 00001010 源码
11111111 11111111 11111111 11110101 反码
11111111 11111111 11111111 11110110 补码
00011111 11111111 11111111 11111110 补码向右移动3位,左边用0补齐
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值