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

算法入门篇——用位运算解决一些问题

目录

1.判断一个数是2的次方数

2.统计一个数,它的二进制数中,1的个数

3.在2*(n-1)个数中,找到只出现一次的那个数


1.判断一个数是2的次方数

这个问题有好几种做法,但是最优雅的解法是用’位运算‘来做。

总所周知,一个2的次方数,其二进制必定是100....000,将其减1,就是0111....111,两者进行与

运算必定是0。

即a&(a-1)=0

代码如下:

public class 二的次方数 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);while (sc.hasNext()) {int a = sc.nextInt();if ((a & (a - 1)) == 0) {System.out.println("是2的次方数");} else {System.out.println("不是2的次方数");}}}
}

2.统计一个数,它的二进制数中,1的个数

这个问题,也有很多思路,但是在这里,我们用位运算来做,还是用这个a&(a-1)来做,这个式子

有什么作用呢?

它就是把这个数的二进制数最右边的1置0

举个例子

1.末尾为1

a:    000001

a-1: 000000

相与后为:000000

2.末尾不为0

a:    001100

a-1: 001011

相与后为 001000

看见没,就是把最右边的1置0,只要它不等于0,继续进行这样的操作,即可,就能统计出1的个

代码:

public class 二进制中1的个数 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int a = sc.nextInt();int count = 0;while (a > 0) {a = a & (a - 1);count++;}System.out.println(count);}}
}

3.在2*(n-1)个数中,找到只出现一次的那个数

这里,我们使用异或运算,使用常规方法会出现很多问题。

因为

x^x=0    相同异或为0

x^0=x     与0异或 为原数

若测试数据为:1 2 3 2 3 4 4

按照交换律:2 2 3 3 4 4 1

前面相同的都异或为0,再与1异或,为1

代码:

public class 查找只出现一次的数 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = 0;int ans = 0;//记录结果int a=0;//每次读入的数while (sc.hasNext()) {ans=0;//每一次测试将结果置0n = sc.nextInt();for (int i = 0; i < 2 * n - 1; i++) {a=sc.nextInt();ans=ans^a;}System.out.println(ans);}}
}

 

http://www.lryc.cn/news/106271.html

相关文章:

  • 腾讯云-宝塔添加MySQL数据库
  • 【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序
  • Mysql删除重复数据通用SQL
  • “快速入门Spring Boot:从零开始构建Web应用程序“
  • 微信小程序tab加列表demo
  • 深入挖掘地核和地幔之间的相互作用
  • 网络:SecureCRT介绍
  • 我的512天创作纪念日
  • mysql进阶-用户密码的设置和管理
  • 2023年最新智能优化算法之——切诺贝利灾难优化器 (CDO),附MATLAB代码和文献
  • uniapp跨域解决
  • 力扣-94、144、145-前中后序遍历
  • 什么是线程?为什么需要线程?和进程的区别?
  • 【业务功能篇61】SpringBoot项目流水线 dependencyManagement 标签整改依赖包版本漏洞问题
  • uniapp使用getStorage对属性赋值无效
  • 20230802-下载并安装android-studio
  • python 第九章 —— GUI界面开发(tkinter详解)
  • 线段树合并例题
  • Stable Diffusion 硬核生存指南:WebUI 中的 VAE
  • vue项目 前端加前缀(包括页面及静态资源)
  • 使用文心一言等智能工具指数级提升嵌入式/物联网(M5Atom/ESP32)和机器人操作系统(ROS1/ROS2)学习研究和开发效率
  • 【Rust 基础篇】Rust动态大小类型:理解动态大小类型与编写安全的代码
  • 【Python】使用nuitka打包Python程序为EXE可执行程序
  • 背景图片及精灵图
  • 简要介绍 | 生成模型的演进:从自编码器(AE)到变分自编码器(VAE)和生成对抗网络(GAN),再到扩散模型
  • 8.2Thread类的常见属性
  • 博客摘录「 mvvm框架工作原理及优缺」2023年7月31日
  • 第12章 Linux 实操篇-Linux磁盘分区、挂载
  • 使用express搭建后端服务
  • 深度学习——划分自定义数据集