java 位运算作用_关于java中位运算符的使用和理解

关于java中位运算符的使用和理解

&(按位与) ‘ & ’ 符号的作用是对运算符的两侧以二进制表达的操作符按位进行‘与’运算。 规则: 只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为0,结果就为0)。

个人理解:在编程中,我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为只有都为‘true’的时候才为‘true’,否则就是‘false’。

举例:  5 & 10 = ? 10 的二进制为:1010 5 的二进制为:0101 则 5 & 10 的二进制为 0000,完整的运算为 5 & 10 = 0  int i = 12; i &= 7; i = ? ‘ &= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i &= 7 可以看成 i = i & 7 所以i = 4

|(按位或) ‘ | ’ 符号的作用是对运算符两侧以二进制表达的操作符按位分别进行’或’运算。 规则: 只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为1,结果就为1)。

个人理解:在编程中,我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为只要有一个为‘true’的时候就为‘true’,否则就是‘false’。

举例:  5 | 10 = ? 10 的二进制为:1010 5 的二进制为:0101 则 5 | 10 的二进制为 1111,完整的运算为 5 | 10 = 15  int i = 12; i |= 7; i = ? ‘ |= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i |= 7 可以看成 i = i | 7 所以i = 15

^(按位异或) ‘ ^ ’ 符号的作用是对运算符两侧以二进制表达的操作数按位分别进行’异或’运算。 规则: 仅当两个操作数不同一时候。对应的输出结果才为1,否则为0。

个人理解:在编程中,我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为值不相等的时候为‘true’,值相等的时候为‘false’。

举例:  5 ^ 10 = ? 10 的二进制为:1010 5 的二进制为:0101 则 5 ^ 10 的二进制为 1111,完整的运算为 5 ^ 10 = 15  int i = 12; i ^= 7; i = ? ‘ ^= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i ^= 7 可以看成 i = i ^ 7 所以i = 11

~(按位非) ‘ ~ ’ 符号的作用是将各位数组取反。 规则: 全部的0变为1,1变为0。

个人理解:在编程中,我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为将‘true’变成‘false’,而‘false’变为‘true’。

举例:  ~ 10 = ? 10 的二进制为:1010 取反后为:1111 1111 1111 0101 则 1111 1111 1111 0101 的十进制为 -11,完整的运算为 ~ 10 = -11

很多人对负数的二进制的转换很迷惑,在这里为大家讲解下: 因为电脑的世界中只有 ‘ 1 ’ 和 ‘ 0 ’ ,所以在表示正负数的时候是从最高位看的,最高位如果为 ‘ 1 ’ 则为负数,如果是 ‘ 0 ’ 则是正数。 但是如果负数单纯是把最高位变为1的话,在运算中会出现不是我们想要的值。所以引入了:‘原码’,‘反码’,‘补码’。 正数的‘原码’,‘反码’,‘补码’都一样。 负数的‘反码’是对除了符号位(最高位)的‘原码’取反,而‘补码’是对‘反码’ + 1,而计算机所采用的就是‘补码’的方式。 示例: -11的‘原码’是 : 1000 0000 0000 1011 求出对应的反码 : 1111 1111 1111 0100 求出对应的补码 : 1111 1111 1111 0101 所以在计算机中 ‘ -11 ’ 对应的二进制为 ‘ 1111 1111 1111 0101 ’

<

个人理解:左移可以看成是乘以2的多少次方。3 << 3就代表3乘以2的3次方。

举例:  10 << 3 = ? 10 的二进制为:0000 0000 0000 1010 移位后为:0000 0000 0101 0000 (80) 则 10 << 3 = 80  int i = 5; i <<= 4; i = ? ‘ <<= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i <<= 4 可以看成 i = i << 4 所以i = 80

>>(右位移运算符) ‘ >> ’ 符号的作用是将一个运算对象的各二进制位全部右移若干位。 规则: 正数左补0,负数左补1,右边丢弃。

个人理解:正数右移可以看成是跟2的多少次方取模,10 >> 3就代表10跟8取模得1。而负数则需要对应的转换,因为负数进行了补码的操作,所以跟正数的逻辑不同

举例:  10 >> 3 = ? 10 的二进制为:0000 0000 0000 1010 移位后为:0000 0000 0000 0001 则 10 >> 3 = 1  int i = 5; i >>= 4; i = ? ‘ >>= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i >>= 4 可以看成 i = i >> 4 所以i = 0

>>>(无符号右位移运算符) ‘ >>> ’ 符号的作用是将一个运算对象的各二进制位全部右移若干位。 规则: 右移后左边空出的位用零来填充。移出右边的位被丢弃。无符号的意思是将符号位当作数字位看待。

个人理解:正数的无符号右移可以看成是跟2的多少次方取模,10 >>> 3就代表10跟8取模得1。而负数的无符号右移是不同的,就不需要再进行转换的操作,-1 >>> 1 = 2147483647

举例:  10 >>> 3 = ? 10 的二进制为:0000 0000 0000 1010 移位后为:0000 0000 0000 0001 则 10 >>> 3 = 1  int i = 5; i >>>= 4; i = ? ‘ >>>= ’ 的逻辑跟 ‘ += ’ 的处理逻辑是一样的 i >>>= 4 可以看成 i = i >>> 4 所以i = 0

转载请标明出处:https://blog.csdn.net/qq_36423017/article/details/82222859

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值