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

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

位运算

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


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


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


bc836aefb375d6ce8510d234fb56df01_64e904a6b2f39359547a3f1deedbb747.png


运算符

在了解运算符之前我们需要知道 : 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


8c75f0febeecd94486d182f2665f6ce2_0b9c09931d72ba11f05f50f5da55c6be.png


按位或 : 5 | 7

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


8c75f0febeecd94486d182f2665f6ce2_0b9c09931d72ba11f05f50f5da55c6be.png


按位异或 : 5 ^ 7

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


bab930c5aa194f8eb632d15afca862e4_c1b9a5da59bf4651f3182271ac5d442b.png


按位取反 : ~5

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


a488bd34170f0f308c648c53f9b3cb07_8fde396472458b0938001fb44abb1e99.png


按位左移 : 5 << 2

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


5baf7d79e88184f7aa71d571c5fc1ec4_4f4fdb6e60a8ba4d23a250dd11f6d638.png


按位右移 : 5 >> 2

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


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


df1dbb8798a9651dc620252ffe527204_429e90c8c223a4878eb9a575e0177201.png


-5 >> 2

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


e46c358cf820a56931ca45b341d8ca35_66ae12fd3a5c665bab8b851adaaac9c9.png


无符号右移: 5 >>> 2

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


6155bcdf2bb0ce666020111c63740f60_214e9bf5334ca61519179d2a4ad07fa3.png


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


daf7f20934326e49095083d39e4acdce_2ef3aa44dda87a717ea35b26206bcf2f.png


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

相关文章
|
2天前
|
计算机视觉
位运算
【5月更文挑战第8天】位运算。
10 1
|
9月前
|
算法 Java 编译器
第 13 天_位运算
第 13 天_位运算
61 0
|
9月前
位运算专题(个人理解)
位运算专题(个人理解)
44 0
|
10月前
|
算法 数据安全/隐私保护
基本的位运算
基本的位运算
|
10月前
|
算法
位运算能做什么
位运算能做什么
39 0
|
11月前
|
存储 Java 程序员
“高端”的位运算
大家好,我是王有志。原计划迭代作为预备知识的收尾,不过在解2的幂和4的幂时,想到关于数字2的问题可以通过位运算去解决,因此补充了关于位运算的内容。
62 1
|
12月前
位运算(1)
位运算(1)
|
存储
【位运算】怕位运算?有我你何足畏惧
【位运算】怕位运算?有我你何足畏惧
59 0
位运算的小技巧
快速学习位运算的小技巧