文章目录
- 位运算符
- 如何记住?
- 实际编程中有什么实际应用呢?
-
- [1. 权限控制](#1. 权限控制)
- [2. 图形处理:](#2. 图形处理:)
- [3. 网络通信:](#3. 网络通信:)
- [4. 数据加密:](#4. 数据加密:)
- [5. 数据压缩:](#5. 数据压缩:)
- [6. 高效计算:](#6. 高效计算:)
- [7. 底层编程:](#7. 底层编程:)
- [8. 算法优化:](#8. 算法优化:)
- [9 .硬件交互:](#9 .硬件交互:)
- [10. 位图操作:](#10. 位图操作:)
平时开发中看源码时 ,看到 Android Telecomm 电话模块时,又看到了运位算。于是决定再小结一下位运算。
java
private int getCurrentCallSupportedRoutes() {
int supportedRoutes = CallAudioState.ROUTE_ALL;
if (mCallsManager.getForegroundCall() != null) {
supportedRoutes &= mCallsManager.getForegroundCall().getSupportedAudioRoutes();
}
return supportedRoutes;
}
private int modifyRoutes(int base, int remove, int add, boolean considerCurrentCall) {
base &= ~remove;
if (considerCurrentCall) {
add &= getCurrentCallSupportedRoutes();
}
base |= add;
return base;
}
在 Java 中,位运算是一种直接对整数的二进制位进行操作的运算方式。这些运算通常比常规的算术运算更快,因为它们直接在底层硬件上执行。
位运算符
-
按位与(&) :对应位都是1才为1。 (使用按位与(
&
)运算符可以检查一个整数的某个位是否被设置) -
按位或(|) :对应位有一个是1就为1。 (使用按位或(
|
)和按位与(&
)运算符可以设置或清除一个整数的某个位) -
按位异或(^) :对应位不同则为1。(使用按位异或(
^
)运算符可以在不使用临时变量的情况下交换两个变量的值) -
按位取反(~) :对应位取反(只针对单个整数操作)。
(按位取反运算符常用于位掩码操作,例如清除某个特定的位或创建一个只有某些位被设置的掩码。它也可以用于快速计算一个数的负值(在有符号整数表示中)或进行某些位级的优化操作。)
-
左移(<<):左移指定的位数,右侧补0。
-
右移(>>) :右移指定的位数,左侧用符号位填充(正数补0,负数补1)。 (左移(
<<
)和右移(>>
)运算符用于将数据向左或向右移动指定的位数。这常用于乘以或除以2的幂次) -
无符号右移(>>>):右移指定的位数,左侧总是补0(不论正负)。
如何记住?
- "&" 运算符可以想象成两扇门(每个门的开闭状态代表一个二进制位),只有两扇门都打开时(即两个位都是1),光线才能通过。
- "|" 运算符可以想象成电路中的并联开关,只要有一个开关打开(即一个位是1),电路就通电。
- "^" 运算符可以想象成异性的吸引(相同为0,相异为1),或者想象成两个灯泡,一个亮另一个就灭
实际编程中有什么实际应用呢?
位运算符在实际编程中有许多应用场景,尤其是在需要高性能、节省内存空间或进行低级系统编程时。以下是一些实际应用场景的例子:
1. 权限控制
在操作系统、数据库或应用程序中,权限控制是一个重要的功能。通常,权限可以用位来表示,因为位运算非常快且内存占用小。例如,一个用户可能有读、写、执行三种权限,每种权限可以用一个位来表示。
java
// 假设权限如下定义
final int READ = 1 << 0; // 0001
final int WRITE = 1 << 1; // 0010
final int EXECUTE = 1 << 2; // 0100
// 用户的权限可以是一个整数的组合
int userPermissions = READ | WRITE; // 0011
// 检查用户是否有某个权限
if ((userPermissions & READ) != 0) {
// 用户有读权限
}
2. 图形处理:
在图形编程中,颜色通常由红、绿、蓝(RGB)三个分量组成,每个分量可以是一个0到255之间的整数。这些整数可以转换为8位的二进制数,因此可以使用位运算来混合、修改或比较颜色。
位运算也常用于图像压缩算法中,如RLE(Run-Length Encoding)或简单的颜色索引表。
在图形和图像处理中,颜色通常使用多个位来表示(如RGB颜色模型中的每个通道使用8位)。按位取反运算符可以用于快速反转颜色的每个通道的值,实现颜色反转的效果。
3. 网络通信:
在网络通信协议中,数据通常以二进制形式传输。位运算可以用来解析和构造网络数据包,如TCP/IP、UDP等协议中的头部字段。
在某些应用中,如游戏或实时通信,位运算也可以用来优化数据的发送和接收,减少带宽占用。
4. 数据加密:
一些加密算法(如异或加密)使用位运算来加密和解密数据。虽然这些算法可能不如现代加密算法(如AES)安全,但在某些场合下仍然有用。
5. 数据压缩:
一些压缩算法(如Huffman编码、游程编码等)使用位运算来编码和解码数据。这些算法通过减少数据的冗余来压缩数据。
6. 高效计算:
在处理大量数据时,位运算通常比普通的算术运算更快,因为它们直接在硬件级别上操作二进制位。因此,位运算常用于需要高性能的算法中,如排序、搜索和模拟等。
在某些算法中,按位取反运算符可以用于优化性能。例如,在查找算法中,可以使用按位取反运算符来快速检查一个元素是否存在于一个位图中(bit array)。位图是一种使用位数组来表示集合的数据结构,通过按位取反和按位与操作,可以快速检查元素是否存在于集合中。
7. 底层编程:
在嵌入式系统、操作系统或游戏开发中,位运算常用于操作硬件寄存器、内存地址或位图等底层资源。这些操作通常需要精确控制二进制位,因此位运算在这些场合下非常有用。
8. 算法优化:
在某些算法中,如动态规划、图论或搜索算法中,位运算可以用来优化存储和计算过程。例如,可以使用位运算来表示状态、存储中间结果或加速计算过程。
9 .硬件交互:
在与硬件直接交互的场合下(如驱动程序开发、嵌入式系统编程等),位运算被用来读取和设置硬件寄存器的值。这些寄存器通常用于控制硬件的行为和状态。
10. 位图操作:
位图(Bitmap)是一种使用位数组来表示图像或其他数据的数据结构。位运算可以用于在位图上进行各种操作,如绘制图形、检测碰撞或进行图像处理等。