`

java 位运算

    博客分类:
  • java
阅读更多
引用


位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
移位运算
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
  2 "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
  3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
  4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。
位运算符的应用 (源操作数s 掩码mask)
(1) 按位与-- &
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
(2) 按位或-- |
  常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3) 位异或-- ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)
  目 标 操 作 操作后状态
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//无符号x,y比较
x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较
应用举例
(1) 判断int型变量a是奇数还是偶数 
a&1 = 0 偶数
  a&1 = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1<<k)
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
(5) int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) //返回X,Y 的平均值

  return (x&y)+((x^y)>>1);
}
(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂
boolean power2(int x)
{
  return ((x&(x-1))==0)&&(x!=0);
}
(9)不用temp交换两个整数
void swap(int x , int y)
{
  x ^= y;
  y ^= x;
  x ^= y;
}
(10)计算绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
(11)取模运算转化成位运算 (在不产生溢出的情况下)
  a % (2^n) 等价于 a & (2^n - 1)
(12)乘法运算转化成位运算 (在不产生溢出的情况下)
  a * (2^n) 等价于 a<< n
(13)除法运算转化成位运算 (在不产生溢出的情况下)
  a / (2^n) 等价于 a>> n
  例: 12/8 == 12>>3
(14) a % 2 等价于 a & 1 
(15) if (x == a) x= b;
   else x= a;
   等价于 x= a ^ b ^ x;
(16) x 的 相反数 表示为 (~x+1)


实例

  功能 | 示例 | 位运算
----------------------+---------------------------+--------------------
去掉最后一位 | (101101->10110) | x >> 1
在最后加一个0 | (101101->1011010) | x << 1
在最后加一个1 | (101101->1011011) | x << 1+1
把最后一位变成1 | (101100->101101) | x | 1
把最后一位变成0 | (101101->101100) | x | 1-1
最后一位取反 | (101101->101100) | x ^ 1
把右数第k位变成1 | (101001->101101,k=3) | x | (1 << (k-1))
把右数第k位变成0 | (101101->101001,k=3) | x & ~ (1 << (k-1))
右数第k位取反 | (101001->101101,k=3) | x ^ (1 << (k-1))
取末三位 | (1101101->101) | x & 7
取末k位 | (1101101->1101,k=5) | x & ((1 << k)-1)

取右数第k位 | (1101101->1,k=4) | x >> (k-1) & 1

把末k位变成1 | (101001->101111,k=4) | x | (1 << k-1)
末k位取反 | (101001->100110,k=4) | x ^ (1 << k-1)
把右边连续的1变成0 | (100101111->100100000) | x & (x+1)
把右起第一个0变成1 | (100101111->100111111) | x | (x+1)
把右边连续的0变成1 | (11011000->11011111) | x | (x-1)
取右边连续的1 | (100101111->1111) | (x ^ (x+1)) >> 1
去掉右起第一个1的左边 | (100101000->1000) | x & (x ^ (x-1))
判断奇数 (x&1)==1
判断偶数 (x&1)==0


引用

=== 1. and运算 ===
  and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.
=== 2. or运算 ===
  or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
分享到:
评论

相关推荐

    OPPO 推搜广多业务多场景的统一预估引擎实践 (1).pdf

    OPPO 推搜广多业务多场景的统一预估引擎实践 (1).pdf

    C#HR人事管理系统源码数据库 MySQL源码类型 WebForm

    HR人事管理系统源码 项目描述 人事管理,对用户,部门,职位,进行管理 运行环境:jdk7+tomcat7+mysql+IntelliJ IDEA+maven 使用技术:spring+spring mvc+mybatis+ligerUI+jquery+metronic+jsp

    量化投资技术实验报告指导-实验任务与评估标准解析

    内容概要:本文档详细介绍了《量化投资与风险管理》课程的背景、学习目标、课堂规则和课程考核方式。特别关注理论课程的学习,其中包括三次课后作业,主要考察学生的格式规范、内容全面性和答案正确性。实验部分则由多次作业组成,重点考查因子的有效性、数据处理能力和实验报告的质量,还要求学生能够独立设计因子并对其进行详尽分析。此外,实验课程还包括最终的成绩验收答辩。 适合人群:适用于正在参加《量化投资与风险管理》课程的学生或希望深入理解和掌握量化投资方法的研究者。 使用场景及目标:帮助参与者明确每个教学环节的任务指标及评判准则,提高实验技能,确保能按时按质完成各项任务。 阅读建议:建议仔细研读每条考核细则,注意实验报告的具体要求(如数据处理流程)和最终答辩所需材料。同时关注实验过程中可能出现的问题及其解决思路,有助于提升实践能力并获取更好的评价结果。

    ioDraw-v3.1.0-mac-x64.dmg,流程图、思维导图、甘特图绘制软件,macOS x64版

    1、ioDraw 是免费的在线作图软件,用于制作流程图、思维导图、甘特图、白板手绘图、mermaid流程图、海报设计、折线图、柱状图、拓扑图、组织结构图、UML、ER和时序图、平面设计图、电子电路图等,无需注册即可使用 2、替代Visio的免费软件,无使用限制 3、适合程序员、白领、系统架构师、项目经理、平面设计师、产品经理使用 4、v3.1.0变更日志: 新增将文件保存到百度网盘。 新增对macOS的支持。 修复第三方平台文件列表页显示问题。

    计算机网络 - 思科模拟器 - Cisco Packet Tracer 令牌.zip

    资源简介:计算机网络 - 思科模拟器 - Cisco Packet Tracer 令牌.zip 一、资源概述 本资源是一个压缩包(.zip格式),内含用于注册或激活思科(Cisco)Packet Tracer模拟器的令牌(Token)。Cisco Packet Tracer是一款由思科公司开发的网络模拟软件,它允许用户在没有实际硬件的情况下,通过模拟的网络环境进行网络配置、故障排除和实验。这款软件是学习计算机网络技术、CCNA(思科认证网络工程师)考试备考等不可或缺的工具。 二、资源用途 激活Packet Tracer:对于需要从思科官网下载或更新Packet Tracer软件的用户来说,有效的令牌是完成注册和激活流程的关键。本资源提供的令牌旨在帮助用户顺利完成这一过程,从而享受Packet Tracer提供的全部功能。 学习与实践:Packet Tracer为用户提供了一个直观且易于操作的模拟网络环境,用户可以在其中创建自定义网络拓扑、配置设备参数、模拟网络流量等。通过这一平台,用户可以深入学习网络协议、路由与交换技术、网络安全等领域的知识,并通过实践加深理解。

    电力信号分离中的新型DNN-HMM监督方法

    内容概要:本文提出了一种基于深度神经网络(DNN)与隐马尔科夫模型(HMM)相结合的新方法,用于非侵入性负载监测系统(NILM)中的单通道聚合功率信号拆解。传统FHMM方法需要每个负载的HMM模型,计算复杂度高,不适用于大型建筑。新方法为每个待提取负载训练一个带两种发射概率的HMM,一种模拟单个负载的高斯分布,另一种利用DNN建模聚合计量信号。该方法仅需聚合信号即可推断特定负载的状态序列。 适用人群:从事机器学习、智能电网、信号处理的研究人员和技术人员。 使用场景及目标:①从单通道聚合功率信号中提取个别电器设备的能耗情况;②优化能源管理和智能家居系统的能效。 其他说明:该方法通过实验验证了对不同类型的电器设备的有效性和准确性,尤其适用于低频数据集,如REDD数据集。

    java校园跑腿综合服务网平台小程序源码带部署搭建教程数据库 MySQL源码类型 WebForm

    Java校园跑腿综合服务网平台小程序源码带部署搭建教程 源码包含:client 客户端+server 服务端+wxapp小程序 一款基于JAVA开发的多校综合服务平台源码,支持第三方跑腿,代拿代买一些东西等服务,支持多校区使用,源码分为前端和后台服务等 需要工具:linux系统宝塔面板,环境nginx、mysql、pm2管理器(它自带nodejs)安装部署搭建请参考源码里面的教程文档

    电子通讯领域中达锂电子UART/485通讯协议详解与应用

    内容概要:本文档详细介绍东莞市达锂电子有限公司UART/485通讯协议,包括协议的基本时序、地址分配、物理层参数以及各数据段的内容及其作用,旨在为嵌入式系统设计、通讯协议开发者提供全面的技术指导。文档内容涵盖了不同设备间的指令集定义、传输方式和具体的实施步骤,同时提供了详细的版本变更记录。文档还强调了各数据字段的具体格式和意义,并列举了几种常见数据包的构建方法。文档还介绍了故障状态的诊断编码以及各种异常情况的具体含义。 适合人群:硬件工程师、通讯协议工程师、电子系统集成师以及对UART/485通讯协议感兴趣的科研和技术人员。 使用场景及目标:①嵌入式系统的设计与开发;②硬件之间的通信测试与故障排除;③深入了解通讯协议的工作机制,提升产品稳定性。 阅读建议:本手册详细阐述了各项通讯参数和数据格式,因此在阅读过程中,需要特别关注具体的通讯参数设置、地址分配规则和数据校验方法,同时可以结合实际应用场景进行理解和测试。

    复杂业务场景下的 Flutter 混合开发技术实践.pdf

    复杂业务场景下的 Flutter 混合开发技术实践.pdf

    C#CS小型医院HIS门诊挂号收费管理系统源码数据库 SQL2008源码类型 WinForm

    C/S小型医院HIS门诊挂号收费管理系统源码 一、主要功能 1、字典维护:药品信息添加修改 收费项目管理 2、门诊管理:门诊挂号 划价 收费管理 药房发药管理等 3、销售管理:科室挂号 药品库存管理 二、注意事项 1、开发环境为Visual Studio 2010,数据库为SqlServer2008R2,使用.net 3.5开发。

    yolo算法-皮肤问题检测数据集-2659张图像带标签-眼袋-皱纹-皮肤发红-油性皮肤-干性皮肤-黑斑-黑头-毛孔-痤疮.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    课程设计-基于MATLAB的汽车出入库计时计费系统+项目源码+文档说明+课题介绍+GUI界面

    <项目介绍> - 课题名称为基于MATLAB的汽车出入库计时计费系统,带有丰富的人机交互GUI界面。传统的车牌识别,仅仅是对车牌照片进行识别,显得中规中矩,不容易通过,并且难得高分,容易挂。因此计划要在此基础上有所创新方得可以避开其他千篇一律思路。因 此建议在车牌识别基础上加入出、入库识别,并且实行计算停车时间以及停车费用,计算剩余停车位的数量。整个设计在一个GUI界面上完成。 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    java版快速开发框架后台管理系统源码数据库 MySQL源码类型 WebForm

    Java版快速开发框架后台管理系统源码 一套快速开发框架、脚手架、后台管理系统、权限系统,上手简单,拿来即用。为广大开发者去除大部分重复繁锁的代码工作。 后端采用spring boot、mybatis(已集成mybatis-plus增强插件,开发更迅速,可查看官方文档了解更多:mybatis-plus)、shiro框架 前端采用layui作为UI框架,实现90%的移动端自适应,支持主题更换 提供代码生成器(wiki使用文档),只需编写20%左右的代码, 剩下全部自动生成;支持一键及批量功能模块生成,并支持一定程度上的自定义配置并生成代码,相对比较灵活 功能模块:用户管理 部门管理 菜单管理 角色管理 字典管理 操作日志 代码生成 组件管理

    【重磅,更新!】全国地级市POI兴趣点数据(2023年)

    1、资源内容地址:https://blog.csdn.net/abc6838/article/details/143816673 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理

    (源码)基于SpringBoot和ApacheRocketMQ的动态ZKMQ系统.zip

    # 基于Spring Boot和Apache RocketMQ的动态ZKMQ系统 ## 项目简介 本项目是一个基于Spring Boot框架和Apache RocketMQ消息中间件的动态ZKMQ系统。该系统主要用于动态管理和操作ZooKeeper节点,并通过RocketMQ实现消息的发布和订阅。系统支持动态注册服务、节点操作、消息监听等功能,适用于需要动态配置和管理的分布式系统场景。 ## 项目的主要特性和功能 1. 动态ZooKeeper节点管理 支持动态创建、更新、删除ZooKeeper节点。 提供节点变化的监听功能,实时响应节点变化事件。 2. RocketMQ消息发布与订阅 支持动态创建和管理RocketMQ消费者和生产者。 提供消息的发布、订阅和监听功能,支持并发和顺序消息处理。 3. 分布式原子操作 提供分布式原子整数操作,适用于需要全局唯一ID的场景。 4. JSON数据转换

    Java基于springboot+vue的车辆保险理赔平台的设计与实现.rar

    【基于Springboot+Vue的设计与实现】高分通过项目,已获导师指导。 本项目是一套基于Springboot+Vue的管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。也可作为课程设计、期末大作业 包含:项目源码、数据库脚本、开发说明文档、部署视频、代码讲解视频、全套软件等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 环境说明: 开发语言:Java 框架:springboot,mybatis JDK版本:JDK1.8 数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/idea Maven包:Maven3.3

    时间序列-白银-15分钟数据

    时间序列 白银 间隔15分钟

    创建vue+electron项目流程

    创建vue+electron项目流程

    (源码)基于C语言的图像分类预测系统.zip

    # 基于C语言的图像分类预测系统 ## 项目简介 本项目是一个基于多层感知器(MLP)神经网络模型的图像分类预测系统。主要目标是处理图像数据并预测其类别。通过加载预训练的权重和接收用户提供的图像数据,通过神经网络进行预测。适用于机器学习中的图像分类任务。 ## 项目的主要特性和功能 1. 基于C语言实现具备良好的可移植性和性能。 2. 多层感知器(MLP)神经网络用于图像分类预测。 3. 预训练权重加载提高预测准确性。 4. 图像加载功能支持处理多个图像文件。 5. 神经网络层函数包含ReLU激活函数、Softmax函数等。 6. 用户交互支持连续加载图像数据进行预测。 ## 安装使用步骤 1. 下载源码下载项目的源码文件,解压并查看文件结构。 2. 安装编译器确保计算机已安装C语言编译器,如GCC。 3. 阅读代码阅读代码中的注释和说明,了解文件结构和功能。 4. 配置修改根据需要修改配置文件或权重文件路径。

    基于SSM的智慧中医诊所管理系统(前后端代码)

    基于SSM的智慧中医诊所管理系统(前后端代码)

Global site tag (gtag.js) - Google Analytics