一篇搞定位运算(&、|、^、~、>>、<<、>>>)

感兴趣的话大家可以关注一下公众号 : 猿人刘先生 , 欢迎大家一起学习 , 一起进步 , 一起来交流吧!

位运算

在计算机中 , 所有的数据都是以二进制的(0,1)形式存储在设备中 , 而位运算就是运算这些二进制数据

我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1

我们在运用java语言进行编码时 , 遇到最小的单位就是字节 , 而一个字节就是8位 , 每一位都是0或者1, 如下图所示

图片

运算符

在了解运算符之前我们需要知道 : 1表示true,0表示false

符号
含义
运算逻辑
&
按位与

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

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

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

|
按位或

true(1)就是true(1)

无true(1)就是false(0)

^
按位异或

只要相同都是false(0)

只有不同才是true(1)

~
按位取反
把1变0,0变1
<<
左移
把所有位向左移动N位(比如5 << 2 就是向左移动两位) , 右边两位补0 , 左边两位去掉
>>
右移
把所有位向右移动N位(比如5 >> 2 就是向右移动两位) , 如果这个数是负数则补1 , 否则补0 , 右边两位去掉
>>>
无符号右移针对32位和64位 , 所有位向右移动 ,左边位补0

例: 我们以下几个数字来演示下面几个例子

  • 5的二进制对应为 : 00000101

  • -5的二进制为: 11111011

  • 7的二进制对应为 : 00000111

  • 2的二进制对应为 : 00000010

正数的二进制转换为负数的二进制 : 先取反 , 再 + 1 , 如 5转换为-5 , 二进制表示就是 :

00000101 取反 -> 11111010 加1 -> 11111011

负数的二进制转换为正数的二进制 : 先取反 , 再 - 1

11111011 取反 -> 00000011 减1 -> 00000010

需要注意的是 int 类型占4字节 , 所以对应的二进制应该是32位的 , 这里我们只用后面的8位进行演示

按位与: 5 & 8

全true(1),即为true(1) , 全false(0),即为false(0) , 一个false(0)一个true(1),还是false(0) ,运算后得到 : 00000101, 也就是 5

图片

按位或 : 5 | 7

有true(1)就是true(1) , 无true(1)就是false(0) , 运算后得到 : 00000010, 也就是 2

图片

按位异或 : 5 ^ 7

只要相同都是false(0) , 只有不同才是true(1) , 运算后得到 : 0000010 , 也就是 5

图片

按位取反 : ~5

0变为1 , 1变为0 , 运算后得到 : 11111010, 也就是 250

图片

按位左移 : 5 << 2

把所有位向左移动两位 , 右边两位补0 , 左边两位去掉 , 运算之后得到: 00010100 , 也就是20

图片

按位右移 : 5 >> 2

把所有位向右移动两位 , 如果这个数是负数则补1 , 否则补0 , 右边两位去掉

5是正数 , 所以补0 , 如果5是负数 , 那么就补1 , 运算之后得到00000001 , 也就是1

图片

-5 >> 2

运算之后得到11111110 , 也就是-2

图片

无符号右移: 5 >>> 2

无符号右移只针对32位和64位 , 和右移差不多 , 所有位向右移动 , 唯一的区别就是左边位不管什么情况都补0

图片

-5 >>> 2 (32位机器) , 如果是64位机器 , 在前面加32个1

图片

运算之后得到00111111111111111111111111111110 , 也就是1073741822

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lingering fear

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

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

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

打赏作者

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

抵扣说明:

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

余额充值