[java基础揉碎]位运算符

发布时间:2024年01月22日

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?

位运算规则?

文章来源:https://blog.csdn.net/YJH000_/article/details/135736563
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。