爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Java学习之位运算(操作)总结

      首页 知识中心 软件开发 文章详情页

      Java学习之位运算(操作)总结

      2023-05-19 02:20:49 阅读次数:466

      Java,位运算

      最近在反思工作第四年的深度,故而写此系列。
      其他Java系列文章:

      • ​​Java学习之编译、反编译以及字节码入门​​
      • ​​Java学习之String​​
      • ​​Java学习之JDK9新特性​​

      位操作,简单确强大,有一两拨千金奇效;可是平时工作中用得真心不多,故此文章也有备份回顾之意。
      在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。

      基础概念

      进制:位操作是基于二进制;
      位运算符,有与、或、异或、取反、左移、右移这6种,只有​​​~​​取反是单目操作符,其它都是双目操作符。注意运算符的优先级。

      符号

      意义

      说明

      &

      按位与

      参与运算的两个位全为1,结果才为1

      ​​|​​

      或

      两个位都为0,结果才为0

      ^

      异或

      两个位相同时为0,相异为1

      ~

      取反,非运算

      0变1,1变0

      <<

      左移

      二进制左移,高位抛弃,低位补零,<<后面的数字表示左移次数,左移一位即乘以2

      >>

      右移

      二进制右移,移除的位数将被抛弃,>>后面的数字表示右移次数,右移一位即为除以2,不可用于负奇数

      位操作复合操作符:&=、|=、 ^=、<<=、>>=;
      位操作只能用于整形数据;

      原码、反码、补码

      反码:符号位不变,数值位分别"按位取反";
      补码:符号位不变,数值位分别"按位取反",再+1,即反码+1;

      已知补码求原码:符号位不变,数值位按位取反,末位再加1,即补码的补码等于原码;

      二进制应用

      交换两数

      先给出代码:

      int c = 1, d = 2;
      c ^= d;
      d ^= c;
      c ^= d;
      System.out.println("c=" + c + "d=" + d);

      简单分析:

      c = c ^ d;
      d = d ^ c = d ^ c ^ d = c;
      c = c ^ d = c ^ d ^ c = d;

      判断奇偶

      根据最未位来决定,为0就是偶数,为1就是奇数:
      ​​​if ((a & 1) == 0)​​​代替​​if (a % 2 == 0)​​来判断a是不是偶数。

      二进制中1的个数

      很经典的面试题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

      分析:如果一个整数不为0,则此数至少有一位是1。如果把这个整数减1,那原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话),其余所有位将不会受到影响。

      举例:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到的结果是1011。发现减1的结果是把最右边的一个1开始的所有位都取反。此时如果再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。即​​1100&1011=1000​​,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

      public static int getNum(int input) {
      int res = 0;
      while(input != 0) {
      res += 1;
      input = input & (input- 1);
      }
      return res;
      }

      变换符号

      变换符号(学术一点的说法,求补码)就是正数变成负数,负数变成正数。根据高中(亦或是大学)知识,补码=源码的反码 + 1:​​~a + 1;​​

      2的n次幂

      2的n次幂,是一个极其特殊的等比数列,在算法题中使用这个特性,有时候会有奇效;

      // 初始化,可以是任意有效值
      int val = 111;
      // 计算2的n次方
      int result1 = 2 << (n - 1);


      // 判断一个数是否为2的幂次方,是的话,二进制表示时其最高位为1,其余位为0,&一定是0;(val & -val)就是获取最右1的位
      int result1 = (val & (val - 1)) == 0;
      int result2 = (val & -val) == val;
      // 判断一个无符号数是2的n次方-1
      int result3 = (val & (val + 1)) == 0;

      筛素数法

      筛素数法,百度百科定义:是把从1开始的某一范围内的正整数从小到大顺序排列,逐步筛掉非素数留下素数。
      筛选思路:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。
      算法:埃拉托斯特尼筛法、欧拉筛法;不同算法的时间复杂度不同,空间复杂度也不尽相同。
      实际上,我们可以使用位操作来实现,使用素数表进行优化来减小其空间占用。

      // 打印100以内素数
      int max = 100;
      // 用bool数组来作标记的,bool型数据占1个字节(8位)
      boolean[] flags = new boolean[max];
      int [] primes = new int[max / 3 + 1];
      int pi = 0;
      for (int m = 2; m < max ; m ++) {
      if (!flags[m]) {
      primes[pi++] = m;
      for(int n = m; n < max; n += m) {
      flags[n] = true;
      }
      }
      }
      System.out.println(Arrays.toString(primes));

      用位操作来压缩空间占用将会使空间的占用减少八分之七

      int max = 100;
      int[] flags2 = new int[max / 32 + 1];
      pi = 0;
      for (int m = 2; m < max ; m ++) {
      if ((((flags2[m / 32] >> (m % 32)) & 1) == 0)) {
      primes[pi++] = m;
      for(int n = m; n < max; n += m) {
      flags2[n / 32] |= (1 << (n % 32));
      }
      }
      }
      System.out.println(Arrays.toString(primes));

      求绝对值

      上面的知识点的延伸,负数取反加1得正数,正数不变,即得绝对值。
      因此先移位来取符号位,int i = a » 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1:
      int i = a >> 31;
      System.out.println(i == 0 ? a : (~a + 1));
      对于任何数,与0异或都会保持不变,与-1即0xFFFFFFFF异或就相当于取反。因此,a与i异或后再减i(因为i为0或-1,所以减i即是要么加0要么加1)也可以得到绝对值。所以可以对上面代码优化下:
      int j = a >> 31;
      System.out.println((a ^ j) - j);

      不用加法求两数之和

      或运算;异或运算,同为假,异为真!0和1的异或运算如下:0^0 = 0, 1^0 = 1, 0^1 = 1,1^1 = 0
      0和1的二进制加法,
      不考虑进位:1+1=0,1+0=1,0+1=1,0+0=0,
      在不考虑进位的时候,加法可以用异或实现;考虑有进位,0+0进位是0,1+0、0+1进位是0,1+1进位是1,与运算:0&0=0,0&1=0,1&0=0,1&1=1,在考虑进位运算时,加法和&运算类似;
      加法运算可以这样实现:
      1)先不考虑进位,按位计算各位累加(用异或实现),得到a;
      2)然后计算进位,并将进位的值左移,得到值b。若b为0,则a就是加法运算的结果;若b不为0,则a+b即得结果(递归调用这个过程)。

      public int bitAdd(int a, int b) {
      if (b == 0) {
      return a;
      }
      int sum = a ^ b;
      int carry = (a & b) << 1;
      return bitAdd(sum, carry);
      }

      BitSet

      BitSet类:大小可动态改变,取值为true或false的位集合。用于表示一组布尔标志。此类实现一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。默认情况下,set 中所有位的初始值都是 false。
      每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。
      除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。在没有外部同步的情况下,多个线程操作一个 BitSet 是不安全的。

      JDK源码

      JDK源码中有许多巧妙利用位运算的地方,翻看源码,会有很大收获的。

      ConcurrentHashMap

      实例化ConcurrentHashMap时带参数时,会根据参数调整table的大小,确保table的大小总是2的幂次方,调用tableSizeFor的时候每次返回的都是大于等于离该数最近的2的幂次方的数。

      // The largest possible table capacity.
      private static final int MAXIMUM_CAPACITY = 1 << 30;
      // constructor
      public ConcurrentHashMap(int initialCapacity) {
      int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?
      MAXIMUM_CAPACITY :
      tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));
      this.sizeCtl = cap;
      }
      // Returns a power of two table size for the given desired capacity.
      private static int tableSizeFor(int c) {
      int n = c - 1;
      n |= n >>> 1;
      n |= n >>> 2;
      n |= n >>> 4;
      n |= n >>> 8;
      n |= n >>> 16;
      return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
      }

      拓展:求小于等于给定数的最大的一个2的幂次方的数?

      private static int tableSizeFor(int n) {
      n |= n >>> 1;
      n |= n >>> 2;
      n |= n >>> 4;
      n |= n >>> 8;
      n |= n >>> 16;
      return n - (n >> 1);
      }

       

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15851118/5811972,作者:johnny233,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Zookeeper(5) - Curator编程

      下一篇:Java学习之String

      相关文章

      2025-05-14 10:03:13

      arm架构下JAVA开发

      ARM(Advanced RISC Machine)是一种基于精简指令集计算(RISC)设计的处理器架构。它以高效、节能著称,因此广泛应用 于从智能手机到物联网设备的各个领域。

      2025-05-14 10:03:13
      Java , JVM , 嵌入式 , 架构 , 设备
      2025-05-14 10:02:58

      Java实现根据概率中奖率怎么算

      要实现根据概率计算中奖率的功能,可以使用 Java 编程语言编写一个简单的程序。

      2025-05-14 10:02:58
      Java , 概率 , 模拟 , 程序
      2025-05-14 09:51:21

      Java 代码本地设置Hadoop用户名密码

      在Hadoop环境中,通常使用Kerberos进行身份验证。但在一些开发或测试环境中,我们可能需要在本地代码中设置用户名和密码来模拟或进行简单的测试。

      2025-05-14 09:51:21
      Hadoop , Java , 代码 , 使用 , 用户名 , 认证
      2025-05-14 09:51:21

      java 判断map为null或者空

      java 判断map为null或者空

      2025-05-14 09:51:21
      Java , Map , null , 方法 , 是否 , 检查 , 示例
      2025-05-14 09:51:15

      java怎么对线程池做监控

      对Java线程池进行监控是确保系统性能和稳定性的重要部分。监控线程池可以帮助我们了解线程池的状态,如当前活跃线程数、任务队列长度、已完成任务数等。

      2025-05-14 09:51:15
      Java , 方法 , 监控 , 示例 , 线程 , 队列
      2025-05-13 09:53:23

      java动态获取实体类的字段

      在Java中,我们可以使用反射(Reflection)API来动态地获取实体类的字段。

      2025-05-13 09:53:23
      API , Java , 使用 , 字段 , 实体类 , 方法 , 获取
      2025-05-13 09:53:23

      Java静态变量在静态方法内部无法改变值

      在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例。它们可以在没有创建类的实例的情况下访问和修改。如果我们发现在静态方法内部无法改变静态变量的值,这通常是因为我们的代码中有一些逻辑错误或误解。

      2025-05-13 09:53:23
      Java , 变量 , 实例 , 类名 , 访问 , 静态 , 静态方法
      2025-05-12 10:19:12

      springboot学习(2)

      springboot学习(2)

      2025-05-12 10:19:12
      Java , main , springboot , web , 启动 , 方法 , 浏览器
      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      本项目是一套基于spring+jsp+mysql实现的Java web论坛系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      Java , jsp , spring , 功能 , 源码
      2025-05-07 09:08:42

      Java中的异常体系

      Java中的异常体系

      2025-05-07 09:08:42
      Exception , Java , 异常 , 程序
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5243066

      查看更多

      最新文章

      arm架构下JAVA开发

      2025-05-14 10:03:13

      Java实现根据概率中奖率怎么算

      2025-05-14 10:02:58

      Java 代码本地设置Hadoop用户名密码

      2025-05-14 09:51:21

      java 判断map为null或者空

      2025-05-14 09:51:21

      java怎么对线程池做监控

      2025-05-14 09:51:15

      java动态获取实体类的字段

      2025-05-13 09:53:23

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      Java/Android Annotation注解/注入(二)

      2023-04-13 09:37:00

      Android/Java判断字符串String是否为float浮点数或double类型

      2023-04-17 09:39:54

      Java小数点数字和百分号数字之间的转换

      2023-04-13 09:48:57

      Java的自带注解Annotation(一)

      2023-05-10 06:02:06

      Java/Android Annotation注解/注入(三)

      2023-04-13 09:37:00

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Java学习之private关键字

      Java HashMap源码浅析

      Java中的并发数据结构与多线程优化技术

      外观模式(Facade)

      Java教程:从基础语法到高级编程

      用Java给您的图片瘦身之Thumbnailator技术

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号