Java 位运算符 &、|、^、~、<<、>>


位运算符指的是 与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)。

位运算其实就是二进制的运算,加减乘除适用于十进制,而位运算就是二进制的运算。

我们编码中最小的单位是字节,而一个字节有8位,每一位就是一个0或1,所以将十进制的 “1” 用二进制表示就是00000001,十进制的 “2” 用二进制表示就是00000010


1. 运算符 (&)

如果 5&9 那么这个应该怎么运算呢?

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

 5 : 0000 0101 
 9 : 0000 1001

将二进制上下对比取 “1” 的交集,

 1 : 0000 0001 

简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,全true(1),即为true(1),全false(0),即为false(0),一个false(0)一个true(1),还是false(0)


2. 运算符(|)

如果 5|10 那么这个应该怎么运算呢?

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

  5 : 0000 0101 
 10 : 0000 1010

将二进制上下对比取 “1” 的并集,

 15 : 0000 1111 

简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,遇true(1)就是true(1),无true(1)就是false(0)


3. 异或运算符(^)

如果 7^14 那么这个应该怎么运算呢?

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

  7 : 0000 0111 
 14 : 0000 1110

将二进制上下对比取 “1” 的对称差,

  9 : 0000 1001 

简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,只要相同都是false(0),只有不同才是true(1)


4. 取反运算符(~)

如果 ~1 那么这个应该怎么运算呢?

取反运算其实挺简单的,就是在二进制中,把1变0,0变1

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

编程时: ~1 输出结果为 -2

计算机存储时是按照补码存储的。

计算步骤:

1的二进制表示--------------------------------0000 0001

按位取反----------------------------------------1111 1110 (计算机以补码形式存储,所以要求11111110的补码)

求补码-------------------------------------------1000 0010(11111110除符号位,其他位取反加一)

因此 ~1 =-2


5. 左移运算(<<)

如果 5 << 2 那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制 ,

   5 : 0000 0101 

然后二进制中的所有的 “1” 向左移动两位

  20 : 0001 0100

总结规律后得出一个快速的算法
M < < n = M ∗ 2 n M << n = M * 2^{n} M<<n=M2n


6. 右移运算(>>)

如果 20 >> 2 那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制 ,

  20 : 0001 0100

然后二进制中的所有的 “1” 向右移动两位

   5 : 0000 0101 

总结规律后得出一个快速的算法
M > > n = M / 2 n M >> n = M / 2^n M>>n=M/2n


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷赫斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值