Java中的位运算及其常见的应用

news2024/9/27 23:28:34

文章目录

      • 1、位运算
        • 1.1 原码、反码、补码
        • 1.2 位运算符
      • 2、位运算的应用
        • 2.1 取模运算
        • 2.2 奇偶性判断
        • 2.3 交换变量的值
        • 2.4 加法运算

1、位运算

1.1 原码、反码、补码

  • 计算机中所有数据的存储和运算都是以二进制补码的形式进行的。
  • a —> 97,A —> 65,‘0’ —> 48
    ASCII码表
  • 举例:5和-5,Java中int类型的数占4个字节,由于1字节(Byte)=8位(bit),所以int类型的数共占32位。其中第1位是符号位,该位为0表示正数,为1表示负数。其余31位是数值位。
    • 原码:
      5: 0000 0000 0000 0000 0000 0000 0000 0101
      -5:1000 0000 0000 0000 0000 0000 0000 0101
    • 反码:
      5: 0000 0000 0000 0000 0000 0000 0000 0101
      -5:1111 1111 1111 1111 1111 1111 1111 1010
    • 补码:
      5: 0000 0000 0000 0000 0000 0000 0000 0101
      -5:1111 1111 1111 1111 1111 1111 1111 1011
  • 结论:
    • 正数的原码、反码、补码都是一样的。
    • 负数的原码:把正数原码的第一位(符号位)0变成1。
    • 负数的反码:把负数原码的符号位不变,数值位取反(0变成1,1变成0)。
    • 负数的补码:负数反码加上1。
    • 0: 0000 0000 0000 0000 0000 0000 0000 0000
    • -0:1000 0000 0000 0000 0000 0000 0000 0000

1.2 位运算符

  • Java中的位运算符一共有7个:
符号含义
&按位与,and。两个数字相同位上,同1为1,一0为0
|按位或,or。两个数字相同位上,一1为1,同0为0
^按位异或,xor。两个数字相同位上,相同为0,不同为1
~按位取反,not。1变为0,0变为1
<<左移,shl。a << b表示把a的二进制数左移b位,最右边空出的b位用0补充。运算结果相当于a乘以2的b次方
>>右移,shr。a >> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上原来的符号位(正数为0,负数为1)。若a为正数,运算结果相当于a除以2的b次方
>>>无符号右移。a >>> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上0(无论正负都补0)
int a = 5;  // 0000 0000 0000 0000 0000 0000 0000 0101
int b = -5; // 1111 1111 1111 1111 1111 1111 1111 1011
int c = 2;  // 0000 0000 0000 0000 0000 0000 0000 0010

int res = a & c;  // 0000 0000 0000 0000 0000 0000 0000 0000
res = a | c;  // 0000 0000 0000 0000 0000 0000 0000 0111
res = a ^ c;  // 0000 0000 0000 0000 0000 0000 0000 0111
res = ~a;  // 1111 1111 1111 1111 1111 1111 1111 1010
res = a << c;  // 0000 0000 0000 0000 0000 0000 0001 0100
res = a >> c;  // 0000 0000 0000 0000 0000 0000 0000 0001
res = b >>> c;  // 0011 1111 1111 1111 1111 1111 1111 1110

2、位运算的应用

2.1 取模运算

  • 若a、b均为正数,且b是2的n次方(n为自然数),则取模操作 a % b,等价于 a & (b - 1)。
  • 例如:
33 % 16 = 1 等价于 33 & 15 = 1
21 % 8 = 5 等价于 21 & 7 = 5

2.2 奇偶性判断

  • 偶数 & 1 = 0
  • 奇数 & 1 = 1
例如:
4 & 1 = 0
5 & 1 = 1

2.3 交换变量的值

  • 结论:一个数与另一个数异或两次等于该数本身。
  • 例1:给定两个变量,在不引入第三个变量的情况下,交换这两个变量的值。
int a = 3, b = 4;
a = a ^ b;
b = a ^ b;  // 相当于b = (a ^ b) ^ b = a
a = a ^ b;  // 相当于a = (a ^ b) ^ a = b
  • 例2:给定一组数,其中只有一个数出现一次,其它数都出现两次,找出只出现一次的数。
int[] arr = {6, 2, 7, 15, 33, 2, 18, 75, 6, 33, 15, 75, 7};
int n = arr[0];
for (int i = 1; i < arr.length; i++) {
    n = n ^ arr[i];
}
System.out.println("只出现一次的数:" + n);  // n = 18

2.4 加法运算

  • 两个整数的相加,可以看成是无进位的数位相加结果与有进位的数位相加结果之和。其中,无进位相加结果由两数做按位异或运算求得,有进位相加结果由两数做按位与运算后再左移一位求得。
  • 例如:给定两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。 (LeetCode题目:371)
public int getSum(int a, int b) {
	// answer用于存储两数的二进制数,在忽略进位的情况下,按位相加的结果
	// carry用于存储两数的二进制数,按位相加后的进位情况
	// 直到没有进位为止,结束运算
	while (b != 0) {
	    int answer = a ^ b;  // 相当于忽略进位情况的加法运算
	    int carry = (a & b) << 1;  // 相当于只考虑进位情况的加法运算,没有被进位的数位用0表示
	    a = answer;
	    b = carry;
	}
	return a;
}

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

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

相关文章

深入学习Vue.js(十二)编译器

模板DSL的编译器 1.编译器概述 编译器实际上是一段程序&#xff0c;他用来将一种语言A翻译为另一种语言B。其中&#xff0c;A被称为源代码&#xff0c;B被称为目标代码。编译器将源代码翻译为目标代码的过程被称为编译。完整的编译过程通常包含词法分析、语法分析、语义分析、…

软件测试——测试用例

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 测试用例的设计方法 等价类 边界值 错误猜测法 判定表法&#xff08;使用于关系组合&#xff09; 设计步骤 具体例子 正交法 场景设计法…

Redis相关简介

1. Redis 简介 在这个部分&#xff0c;我们将学习以下3个部分的内容&#xff0c;分别是&#xff1a; ◆ Redis 简介&#xff08;NoSQL概念、Redis概念&#xff09; ◆ Redis 的下载与安装 ◆ Redis 的基本操作 1.1 NoSQL概念 1.1.1 问题现象 在讲解NoSQL的概念之前呢&am…

8. R语言画:散点图、直方图、条形图、箱线图、小提琴图、韦恩图

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

九大数据分析方法-综合型分析方法以及如何使用这九大分析方法

文章目录3 综合型分析方法3.1 相关性分析法3.1.1 直接相关3.1.2 间接相关3.2标签分析法3.3 MECE法4 如何使用九大方法本文来源&#xff0c;为接地气的陈老师的知识星球&#xff0c;以及付同学的观看笔记。3 综合型分析方法 3.1 相关性分析法 相关性分析法&#xff1a;寻找指标…

ROS2机器人编程简述humble-第二章-Executors .3.5

ROS2机器人编程简述humble-第二章-Parameters .3.4由于ROS2中的节点是C对象&#xff0c;因此一个进程可以有多个节点。事实上&#xff0c;在许多情况下&#xff0c;这样做是非常有益的&#xff0c;因为当通信处于同一进程中时&#xff0c;可以通过使用共享内存策略来加速通信。…

freeglut 在mfc 下的编译

freeglut 是OpenGL Utility Toolkit (GLUT) library 的替代版本&#xff0c;glut 应用广阔&#xff0c;但比较陈旧&#xff0c;很久没有更新。 我原来的opengl 用的是glut&#xff0c; 想更新到64位版本&#xff0c;怎么也找不到合适的下载。最后找到完全替代版本freeglut。fre…

【Linux】线程概念 | 互斥

千呼万唤始出来&#xff0c;终于到多线程方面的学习了&#xff01; 所用系统Centos7.6 本文的源码&#x1f449;【传送门】 最近主要是在我的hexo个人博客上更新&#xff0c;csdn的更新会滞后 文章目录1.线程的概念1.1 执行流1.2 线程创建时做了什么&#xff1f;1.3 内核源码中…

每刻和金蝶云星空接口打通对接实战

接通系统&#xff1a;每刻3000中大型企业在用&#xff0c;新一代业财税一体化解决方案提供商。旗下拥有每刻报销、每刻档案、每刻云票、每刻财务共享云平台等&#xff0c;助力企业实现财务数字化转型。对接系统&#xff1a;金蝶云星空金蝶K/3Cloud结合当今先进管理理论和数十万…

算法刷题打卡第72天:最少侧跳次数

最少侧跳次数 难度&#xff1a;中等 给你一个长度为 n 的 3 跑道道路 &#xff0c;它总共包含 n 1 个 点 &#xff0c;编号为 0 到 n 。一只青蛙从 0 号点第二条跑道 出发 &#xff0c;它想要跳到点 n 处。然而道路上可能有一些障碍。 给你一个长度为 n 1 的数组 obstacle…

Cheat Engine7.4 训练教程(非常详细)

目录 一.CE是干什么的&#xff1f; 二.怎么获得&#xff1f; 三.训练教程 步骤 1: 加载进程 步骤 2: 精确值扫描 步骤 3: 未知的初始值 步骤 4: 浮点数 步骤 5: 代码查找 步骤 6: 指针 步骤 7: 代码注入 步骤 8: 多级指针 提示&#xff1a;这篇文章不是一天写完的&a…

设计模式-建造者模式

1.概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦…

基于ffmpeg的视频处理与MPEG的压缩试验(下载安装使用全流程)

基于ffmpeg的视频处理与MPEG的压缩试验ffmpeg介绍与基础知识对提取到的图像进行处理RGB并转化为YUV对YUV进行DCT变换对每个8*8的图像块进行进行量化操作ffmpeg介绍与基础知识 ffmpeg是视频和图像处理的工具包&#xff0c;它的下载网址是https://ffmpeg.org/download.html。页面…

MySQL高级

存储引擎 MySQL体系结构&#xff1a; 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 相关操作&#xff1a; -- 查询建表语句 show create table ac…

Python量化交易07——散户反买策略

参考来源&#xff1a;b站up 邢不行 我们都知道在A股&#xff0c;散户一直是最大的韭菜贡献组群。散户买入多的个股&#xff0c;大概率可能跌的很惨&#xff0c;散户卖出多的股票&#xff0c;大概率会涨。 跟着北向资金买能赚钱&#xff0c;那么跟着散户反买&#xff0c;是不是…

宝塔面板部署Django项目教程(手把手)

一、测试环境 系统&#xff1a;centos 7.9 CPU&#xff1a;1核 内存&#xff1a;2G 二、安装宝塔面板 输入命令&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 后面会…

【nvidia CUDA 高级编程】使用cub库优化分布式计算下的原子操作

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

MySQL数据库相关错题本

1) MySQL数据库相关错题本1、存储引擎相关1、MySql的存储引擎的不同MySQL存储引擎主要有InnoDB, MyISAM, Memory, 这三个区别在于:Memory是内存数据引擎, 会断电重启(在双M或者主从架构下会产生较多异常), 且不支持行级锁. 默认索引是数组索引, 支持B索引InnoDB和MyISAM的区别:…

【React全家桶】react简介(一)

react简介创建项目creat-react-app1.1 React特点1.2 引入文件1.3 JSX1.3.1 为什么要用JSX1.3.2 JSX语法规则1.4 虚拟DOM1.5 模块与组件1.5.1 模块React面向组件编程2.1 创建组件2.1.1 函数式组件2.1.2 类式组件2.2 组件实例的三大属性2.2.1 state属性2.2.2 props属性2.2.3 refs…

jvm学习的核心(三)---运行时数据区详解(2)

文章目录1.堆&#xff08;heap&#xff09;1.1 堆的概述1.2 堆的内部结构1.3 堆分代垃圾回收流程的简单理解2.方法区&#xff08; Method Area&#xff09;2.1 HotSpot方法区的演进2.2方法区的内部结构2.3.1 常量池和运行时常量池概念区别1.堆&#xff08;heap&#xff09; 1.1…