Android、Java 中的位运算使用小结

文章目录

  • 位运算符
  • 如何记住?
  • 实际编程中有什么实际应用呢?
    • 1. 权限控制
    • 2. 图形处理:
    • 3. 网络通信:
    • 4. 数据加密:
    • 5. 数据压缩:
    • 6. 高效计算:
    • 7. 底层编程:
    • 8. 算法优化:
    • 9 .硬件交互:
    • 10. 位图操作:

平时开发中看源码时 ,看到 Android Telecomm 电话模块时,又看到了运位算。于是决定再小结一下位运算。

    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。 (使用按位与(&)运算符可以检查一个整数的某个位是否被设置)

  2. 按位或(|):对应位有一个是1就为1。 (使用按位或(|)和按位与(&)运算符可以设置或清除一个整数的某个位)

  3. 按位异或(^):对应位不同则为1。(使用按位异或(^)运算符可以在不使用临时变量的情况下交换两个变量的值)

  4. 按位取反(~):对应位取反(只针对单个整数操作)。
    (按位取反运算符常用于位掩码操作,例如清除某个特定的位或创建一个只有某些位被设置的掩码。它也可以用于快速计算一个数的负值(在有符号整数表示中)或进行某些位级的优化操作。)

  5. 左移(<<):左移指定的位数,右侧补0。

  6. 右移(>>):右移指定的位数,左侧用符号位填充(正数补0,负数补1)。 (左移(<<)和右移(>>)运算符用于将数据向左或向右移动指定的位数。这常用于乘以或除以2的幂次)

  7. 无符号右移(>>>):右移指定的位数,左侧总是补0(不论正负)。

如何记住?

  • “&” 运算符可以想象成两扇门(每个门的开闭状态代表一个二进制位),只有两扇门都打开时(即两个位都是1),光线才能通过。
  • “|” 运算符可以想象成电路中的并联开关,只要有一个开关打开(即一个位是1),电路就通电。
  • “^” 运算符可以想象成异性的吸引(相同为0,相异为1),或者想象成两个灯泡,一个亮另一个就灭

实际编程中有什么实际应用呢?

位运算符在实际编程中有许多应用场景,尤其是在需要高性能、节省内存空间或进行低级系统编程时。以下是一些实际应用场景的例子:

1. 权限控制

在操作系统、数据库或应用程序中,权限控制是一个重要的功能。通常,权限可以用位来表示,因为位运算非常快且内存占用小。例如,一个用户可能有读、写、执行三种权限,每种权限可以用一个位来表示。

// 假设权限如下定义
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)是一种使用位数组来表示图像或其他数据的数据结构。位运算可以用于在位图上进行各种操作,如绘制图形、检测碰撞或进行图像处理等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转微服务-GateWay

目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…

java —— 字符输入流/字符输出流

字符输入流/输出流&#xff0c;是指以字符为单位进行输入或输出的方式。其与字节输入流/字节输出流的用法如出一辙&#xff0c;只是输入/输出单位由字节改为字符。 一、字符输入流 创建步骤&#xff1a; ① 创建输入源文件的 File 对象&#xff1a;File filenew File("…

[图解]建模相关的基础知识-02

1 00:00:01,530 --> 00:00:05,200 第2个概念&#xff0c;谓词&#xff0c;Predicate 2 00:00:07,530 --> 00:00:10,800 或者叫断言&#xff0c;翻译各种各样都有 3 00:00:12,830 --> 00:00:15,050 实际上就是前面命题 4 00:00:15,060 --> 00:00:16,610 相当于常…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

开源网安软件安全国产化替代解决方案亮相2024澳门万讯论坛

近日&#xff0c;2024万讯论坛在澳门成功举办。本次论坛由万讯电脑科技主办&#xff0c;旨在引进国内尖端科技厂商&#xff0c;提供全方位的信创解决方案&#xff0c;分享信创化过程中所面临的挑战及阶段性转换经验。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;…

如何使用 Vue CLI 创建和管理一个 Vue 项目

Vue CLI 是一个基于 Node.js 的命令行工具,可以快速创建和管理 Vue.js 项目。以下是使用 Vue CLI 创建和管理 Vue 项目的步骤: 1&#xff1a;安装 Vue CLI 打开终端或命令提示符,运行以下命令安装 Vue CLI: npm install -g vue/cli安装完成后,可以使用 vue --version 命令检查…

Analytical Model(分析模型)和Compact model(紧凑模型)有什么不同

Analytical Model&#xff08;分析模型&#xff09; 和 Compact Model&#xff08;紧凑模型&#xff09; 在电子工程和半导体物理领域有着不同的应用和特点&#xff1a; Analytical Model&#xff08;分析模型&#xff09;: 理论基础&#xff1a;分析模型基于物理原理和数学公…

jeecg dictText字典值

前端列表的字典值回显&#xff0c;配置了数据字典后&#xff0c;在本地测试可以回显中文的数据&#xff0c; 但在线上服务器不能正常回显出来&#xff1b; 原因是在前端拿到records的列表值时可以拿到dictText的字典&#xff0c;但是线上服务器没有dictText的值&#xff1b; …

聚焦 Navicat 17 新特性 | 模型设计优化与创新

随着 Navicat 17 的正式发布&#xff0c;受到了广泛的关注和讨论。Navicat 产品力又一次大跃迁。新引入的特性显著增强了用户的数据库管理和数据分析体验&#xff0c;包括&#xff1a;模型设计与同步、数据字典、数据分析&#xff08;data profiling&#xff09;、用户体验、查…

共享门店模式:快速打造连锁实体店

在数字化浪潮的冲击下&#xff0c;许多线下实体店正面临前所未有的挑战。然而&#xff0c;在这个变革的时代&#xff0c;共享门店模式&#xff0c;也被称为“共享股东”&#xff0c;正以其独特的魅力&#xff0c;为实体店带来新的生机。 一、共享门店模式的崭新定义 共享门店…

​水经微图Web版1.8.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了注册登录功能&#xff0c;线与面图层新增矩形、圆或军标等绘制功能&#xff0c;以及其它功能的优化。 现在&#xff0c;为你分享一下本轮迭代…

SELinux:安全增强型Linux

SELinux&#xff1a;安全增强型Linux 作用&#xff1a; 可以保护linux系统的安全为用户分配最小的权限 状态&#xff1a; Enforcing&#xff1a;强制保护Permissive&#xff1a;宽松状态Disabled&#xff1a;禁用 为了安全性考虑&#xff0c;希望SELinux设置为Enforcing状态…

PostgreSQL调优工具:PGTune

PostgreSQL调优工具&#xff1a;PGTune 1&#xff0c;PGTune网址 https://pgtune.leopard.in.ua/#/ 参数解释&#xff1a; DB Version&#xff1a;数据库版本 OS Type&#xff1a;操作系统 DB Type&#xff1a;数据库类型&#xff0c;一般默认即可 Total Memory (RAM)&#x…

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

2 - 力扣高频 SQL 50 题(基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;

UML行为图-状态图

概述 创建 UML 状态图的目的是研究类、角色、子系统或组件的实时行为。状态图不仅可用于描述用户接口、设备控制器和其他具有反馈的子系统&#xff0c;还可用于描述在生命期中跨越多个不同性质阶段的被动对象的行为&#xff0c;在每一阶段该对象都有自己特殊的行为。 一、状态…

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

探索Python爬虫:实战演练,打造你的数据采集利器

在这个信息爆炸的时代&#xff0c;数据成为了最宝贵的资源之一。Python&#xff0c;以其简洁的语法和强大的库支持&#xff0c;成为了数据采集和处理的首选语言。本文将带领你走进Python爬虫的世界&#xff0c;通过一系列实战演练&#xff0c;教你如何构建自己的数据采集工具。…

Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 基本用法 示例 特性 高级用法 注意事项 版本更新 示例代码 记忆策略…

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…