java中有7个位运算(&、|、^、~、>>、<<和>>>)
分别是按位与&、按位或|、按位异或^,按位取反~,它们的运算规则是:
按位与& : 两位全为1,结果为1,否则为0
按位或| :?两位有一个为1,结果为1,否则为0
按位异或^: 两位一个为0,一个为1,结果为1,否则为0
按位取反~: 0->1,1->0
比如:
2&3=?
推导过程:
?1.因为2和3是int 类型, 所以一共4个字节, 一个字节8位, 运算时一共32位二进制?
?2.因为在计算机运算的时候,都是以补码的方式来运算的, 所以要得到2的补码?
?3.要的到2的补码先得到2的源码, 因为正数的原码,反码,补码都一样, 得到源码便得到补码
?4.同样得到3的补码和源码, 进行按位与运算,
?5.按位与都为一的才为一, 计算得到运算后的补码
?6.又因为当我们看运算结果的时候,要看他的原码, 而整数补码源码都一样, 所以也得到源码
?7.最后源码换算成十进制得到最终结果2
~-2=??
推导过程:
?1.因为-2是int 类型, 所以一共4个字节, 一个字节8位, 运算时一共32位二进制?
?2.因为在计算机运算的时候, 都是以补码的方式来运算的, 所以要得到-2的补码?
?3.要的到-2的补码先得到-2的反码, 因为负数的补码=它的反码+1, 得到反码便需要到源码
?4.他的源码就是符号位为1(负数),?因为负数的反码=它的原码符号位不变, 其它位取反,得到反码
?5.最后反码+1得到补码, 在对补码进行按位取反运算, 得到运算后的补码
?6.得到的补码变为了正数, 我已源码也是这个补码
?7.最后源码换算成十进制得到最终结果1
~2=??
推导过程:
?1.因为2是int 类型, 所以一共4个字节, 一个字节8位, 运算时一共32位二进制?
?2.因为在计算机运算的时候, 都是以补码的方式来运算的, 所以要得到2的补码?
?3.2的补码源码相同, 所以直接得到它的补码
?4.在对补码进行按位取反运算, 得到运算后的补码
?5.此时运算后的补码是负数, 要得到它的源码需要先得到它的反码,?负数的反码=负数的补码-1
?6.因为负数的原码等于它的符号位不变, 其他位取反, 得到它的原码
?7.最后源码换算成十进制得到最终结果-3
还有3个位运算符>>、<<和>>>
运算规则:
1.算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
2.算术左移<<:符号位不变,低位补0
3.>>>逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
4.特别说明:没有<<<符号
举例:?
这里为了方便观看简洁一点假设是只有一个字节(实际int4个字节)?
1.算术右移 >> 把补码黄色01去掉 并用符号位0补溢出的高位得到00(1>>2代表右移两位)
可以用计算公式进行计算 1/2/2 原本等于0.25但是是整数,舍去小数位得到0
如果是15>>2? 公式则为 15/2/2 舍去小数位得到3
2.算术右移 << 符号位不变 低位补00 最末尾多了两个00?
可以用计算公式进行计算 1*2*2 得到4
如果是4<<3? 公式则为 4*2*2*2? 得到32?