当前位置: 首页 > news >正文

位运算--(二进制中1的个数)

        位运算是计算机科学中一种高效的操作方式,常用于处理二进制数据。在Java中,位运算通常通过位移操作符和位与操作符实现。

        当然位运算还有一些其他的奇淫巧计,今天介绍两个常用的位运算方法:返回整数x的二进制第k位的值和返回x的最后一位1。

1. 返回x的二进制第k位的值

方法:x >> k & 1

示例

        假设我们有一个整数x = 13(二进制为1101),而我们希望获取其第2位的值(从0开始计数),即 k = 2

int x = 13; // 二进制表示为 1101
int k = 2;  
int bitValue = (x >> k) & 1; // (1101 >> 2) = 0011, 最后 & 1 = 1
System.out.println(bitValue); // 输出 1

原理解释

  • >> 代表右移运算符,它会将x的二进制位向右移动k位。
  • & 代表位与运算符,它会将两个相应位进行比较,当两个相应位均为1时,结果为1,否则为0。

        通过右移k位后,原本第k位的数据会移到最右侧,即最低位,接下来使用& 1可以判断这个最低位的值是0还是1。

        在这个例子中,右移2位后,二进制表示变为 0011,然后通过& 1获取最后一位的值,结果是1,说明x的第2位为1 。

2. lowbit(x) 返回x的最后一位1

方法:x & -x

示例

import java.io.BufferedInputStream;
import java.util.Scanner;/*** 位运算** 1.返回x的二进制第k位的值   x>>k & 1* 2.lowbit(x)返回x的最后一位1   x & -x*/public class Main {public static int lowbit(int x) {return x & -x;//返回x的最后一位1}public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int n = sc.nextInt();//n为数列的长度while (n-- > 0) {int x = sc.nextInt();int res = 0;while (x > 0) {x -= lowbit(x);//每次减去x的最后一位1res++;}System.out.print(res+" ");//输出二进制中1的个数}}
}

 原理解释

        在这里,-x表示x的补码,补码的计算是通过对x进行按位取反后加1实现的。x & -x的目的就是找到x的二进制表示中最右边的1所在的位置。

        通过这个运算,我们可以得到x的最后一位1,其他位均被清零

总结

        位运算性能优越,适用于多种场景。通过介绍这两种基本位操作,我们可以更加深入地理解和运用位运算,从而提升编程效率。

        希望能对你有所帮助……

相关文章:

  • ESP32-定时器中断
  • uniapp vue3 使用echarts绘制图表 柱状图等
  • 缓存穿透 问题(缓存空对象)
  • Java | Leetcode Java题解之第436题寻找右区间
  • Python 如何使用 unittest 模块编写单元测试
  • Vue75 编程式路由导航
  • Azure Data Box 80 TB 现已在中国区正式发布
  • Vue使用axios二次封装、解决跨域问题
  • LabVIEW闪退
  • Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)
  • 2.1 HuggingFists系统架构(一)
  • 快讯:腾讯轻量服务器四周年,最低一折续费,还有免费升配
  • [Redis][主从复制][中]详细讲解
  • 在什么时候需要用到常引用const---情景
  • Java中的JDK8及后续的重要新特性
  • Angular数据绑定机制
  • ES6 ...操作符
  • go append函数以及写入
  • java 多线程基础, 我觉得还是有必要看看的
  • Lsb图片隐写
  • spark本地环境的搭建到运行第一个spark程序
  • vue-loader 源码解析系列之 selector
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 分布式任务队列Celery
  • 机器学习学习笔记一
  • 使用agvtool更改app version/build
  • 思考 CSS 架构
  • RDS-Mysql 物理备份恢复到本地数据库上
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma pack(1)
  • #在 README.md 中生成项目目录结构
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (苍穹外卖)day03菜品管理
  • (二十三)Flask之高频面试点
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (译)2019年前端性能优化清单 — 下篇
  • (转)socket Aio demo
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET 8 跨平台高性能边缘采集网关
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET开源、简单、实用的数据库文档生成工具
  • .NET使用存储过程实现对数据库的增删改查
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @GlobalLock注解作用与原理解析
  • @Mapper作用
  • @ModelAttribute 注解
  • @Transactional 参数详解
  • @Transient注解