java 位运算实例_JAVA的位运算<<、>>、>>>、&、|、^、~及实例

一、位运算左移:<<

指的是将对应的十进制先转换成二进制数,然后再根据需要移动几位来进行操作。比如

5<<2指的是将5这个十进制数的二进制位往左移动两位

5的二进制:00000000 00000000 00000000 00000101

左移两位:00000000 00000000 00000000 00010100

变成十进制数20。更简单的理解为:将要进行位运算的正数乘以2的N次方(N的值为要移位的位数),即5<<2就是5×2^2=20

在左移过程中,低位(最右边)用0来补,比如5的二进制左移2位后,右边空两位,整数的符号位是0,那么就用0来补。

例如:-5<<2指的是将-5这个十进制数的二进制位往左移动两位.

5的二进制:00000000 00000000 00000000 00000101

按位取反:111111111 111111111 11111111 11111010

+1得到-5的二进制即:111111111 111111111 11111111 1111 1011

左移两位:111111111 111111111 11111111 11101100

这是负数的补码,变为原来的二进制,按位取反+1

10000000 00000000 00000000 00010110

即为-20,最高位是符号位。更简单的理解为(有待考证,但感觉是对的,~~~~~):将要进行位运算的负数()乘以2的N次方(N的值为要移位的位数),即-5<<2就是-5×2^2=-20

二、位运算符右移:>>

与运算符左移类似,不过区别在于:

负数的移位上,比如-4>>2

4的原码:00000000 00000000 00000000 00000100

反码:111111111 111111111 11111111 11111011

+1:111111111 111111111 11111111 11111100

即-4的二进制码是:111111111 111111111 11111111 11111100

右移两位:111111111 111111111 11111111 11111111

取反加+1:10000000 00000000 00000000 00000001

得出-1,最高位是符号位,符号位不会变化的,1代表负数,0代表整数。

负数右移时,高位(最左边)用符号位来补,即右移的是负数,那么用1;右移的是正数,那么用0。

比如:4>>2

4的原码:00000000 00000000 00000000 00000100

右移两位: 00000000 00000000 00000000 00000001

变成1

三、位运算符无符号右移:>>>

无符号右移,忽略符号位,空位都以0补齐

比如6>>>2

二进制码:00000000 00000000 00000000 00000110

右移两位:00000000 00000000 00000000 00000001

高位(最左边)使用0来补齐的。

比如负数:-6>>>2

6的二进制码:00000000 00000000 00000000 00000110

按位取反+1得到-6的二进制码:111111111 111111111 11111111 11111010

右移两位:001111111 111111111 11111111 11111110

变回去按位取反+1:11000000 00000000 00000000 00000010

即得到1073741822

注:

1.x<>y相当于x/2y

2.如果x是负数,那么x>>>2没有什么算术意义,只有逻辑意义

4的原码:00000000 00000000 00000000 00000100

四、与运算符:&-按位与

如果  4&7   那么这个应该怎么运算呢?

首先我们需要把两个十进制的数转换成二进制

4 : 0000 0100

7 : 0000 0111

ba11cbeb98cff5fdad7c61951c129fd5.png

在这里要提到一点,1表示true,0表示false

而与运算的时候相同位之间其实就是两个Boolean的运算

全true(1),即为true(1)

全false(0),即为false(0)

一false(0)一true(1),还是false(0)

五、或运算符:|-按位或

以   5|9   为例

5 : 0000 0101

9 : 0000 1001

c30bb168bf27b3710ea895cd7d6aad69.png

在做或运算的时候

遇true(1)就是true(1),

无true(1)就是false(0)

六、异或运算符:^-按位异或

以 7^15 为例

7:   0000 0111

15: 0000 1111

501605babe1b9ac29d1923b53f735f85.png

在异或的时候

只要相同都是false(0)

只有不同才是true(1)

七、取反运算符:~-按位取反

例:   ~15

同样的先变成二进制:15:0000 1111

61314e9048ba1170ff9293b9e47f4b04.png

这个其实挺简单的,就是把1变0,0变1

注意:二进制中,最高位是符号位   1表示负数,0表示正数

参考博客:https://www.cnblogs.com/SunArmy/p/9837348.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值