基础算法--位运算

2023-09-22 11:04:43
位运算理解:

n >> k:代表n右移k位 比如 000011 >> 1 = 000001 前面会补零(所以第几位是从0开始计算)
n & 1:表示最后一位是否为1
比如:n = 3 = 00111 = 00013 & 1 = 0011 & 0001 为0001可以用来判断最后一位是否为1

lowbit操作,树状数组的基本操作:
lowbit(x)作用是返回x的最后一位1 最右边的一位1。
返回的是一个二进制数,返回最高位的一位1就是最后一位1
例如:x=1010,lowbit(x)=10
x=101000,lowbit(x)=1000

lowbot实现:
就是 x & -x,那么它为什么能返回最后一位1呢?
C++中一个数的负数是原码的补码(取反+1), -x = ~x + 1(负数x是在其负数补码基础上加1)

比如 这里1是最后一位1
原码 x = 1010…100…0
取反后这个0是最后一位0
反码 ~x = 0101…011…1
取反+1 到红色最后一位1以后,不会再往前进位
~x + 1 = 0101…100…0

取到了最后一位1
-x & ~x + 1 = 0000…100......0
在这里插入图片描述

原码、反码、补码

对于一个数,计算机要使用一定的编码方式进行二进制存储,二进制存储是计算机存储的本质。
原码反码补码是机器存储一个具体数字的编码方式,计算机是以二进制补码的形式进行数据的存储。

原码

原码就是符号位加上真值的绝对值,即用最高位表示符号,其余位表示值。比如如果是8位二进制:

  • [+1] (原码) = 0000 0001 最高位为0,表示正数
  • [ -1] (原码) = 1000 0001 最高位为1,表示负数
反码

反码表示方式是用来处理负数的,正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

  • [+1] = [00000001] (原码) = [00000001] (反码)
  • [ -1] = [10000001] (原码) = [11111110] (反码)
补码

补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)

  • [+1] = [00000001] (原码) = [00000001] (反码) = [00000001] (补码)
  • [ -1] = [10000001] (原码) = [11111110] (反码) = [11111111] (补码)
位运算最常用的两种操作:

1.求整数n二进制表示中第k位(从个位开始算)数字是几:n >> k & 1

  • 先把第k位数字移到最后一位 n >> k
  • 再看一下个位是几 x & 1

从最高位右移,再与1做与运算,输出二进制表示

int main()
{
	int n = 10;
	for(int k = 3; k >= 0; k --) cout << (n >> k & 1); 
    return 0;
}

结果:1010

在这里插入图片描述

  1. 求一个 数二进制中1的个数:
  • 在我们的机器上,int数据类型是32位;
  • 因此,我们将1从最低位一直移动到最高位,并将每一位与输出的数值a 做 与运算
  • 如果a对应位是1,则将计数器 cnt+1,最终 cnt 就是该整数二进制数中1的个数。
#include <iostream>
using namespace std;

int lowbit(int x)
{
	return x & -x;
}

int main()
{
	int n;
	cin >> n;
	while(n --){
		int x;
		cin >> x;
		
		int res = 0;
		// 每次减去x的最后一位1 
		while(x) x -= lowbit(x), res ++;
		
		cout << res << ' ';
	}
	
	return 0;
}
更多推荐

小节9:Python之numpy

numpy全称为NumericalPython,是很多数据或科学相关Python包的基础。1、numpy数组(NDarrayN维数组)numpy数组是更适合数据分析的列表。numpy的数组和Python的内置列表有相似之处,也有不同之处。相似之处:我们都可以通过索引去获得某个元素,可以通过切片获得某个范围的多个元素,也

Excel中的宏、VBA

一、宏是什么?EXCELMACRO是一种记录和播放工具,它仅记录您的Excel步骤,并且宏将根据需要播放任意多次。VBA宏可自动执行重复任务,从而节省了时间。这是一段可在Excel环境中运行的编程代码,但您无需成为编码器即可对宏进行编程。但是,您需要VBA的基础知识才能在宏中进行高级修改。作为人类,我们是习惯的产物。我

C/C++计算分数的浮点数值 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录C/C++计算分数的浮点数值一、题目要求1、编程实现2、输入输出二、解题思路1、案例分析三、程序代码四、程序说明五、运行结果六、考点分析C/C++计算分数的浮点数值2019年12月C/C++编程等级考试一级编程题一、题目要求1、编程实现两个整数a和b分别作为分子和分母,既分数a/b,求它的浮点数值(双精度浮点数,保

blog--1 hugo环境

静态博客框架jekyll、hexo和hugo三者之间的区别与差异博客生成器?全名为静态网站生成器,可在任意拥有主机功能的环境下寄存(托管)可直接配合域名进行全球访问劣势:每次更新网页必须重新生成整个网站编译速度(单位:秒)Jekyll:15.90Hugo:4.90Hexo的数据应当介于二者之间。environmentJ

【数学建模】2023华为杯研究生数学建模F题思路详解

强对流降水临近预报我国地域辽阔,自然条件复杂,因此灾害性天气种类繁多,地区差异大。其中,雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以2022年为例,我国强对流天气引发风雹灾害造成的死亡失踪人数和直接经济损失分别占73%和69%。由于强对流天气具有突发性和局地性

智慧公厕预见幸福生活、美好未来

随着城市化的加速发展,公共厕所作为城市基础设施的重要组成部分,对于提升城市形象和居民生活质量起着至关重要的作用。智慧公厕作为智慧城市建设的一部分,正逐渐成为城市管理的新宠儿,能有效助力网络强国、数字中国、智慧社会的建设。本文以智慧公厕源头厂家广州中期科技有限公司,大量精品案例项目实景实图,解读为什么说智慧公厕是预见“幸

windows nginx 本地部署访问静态资源zip文件 配置以及bug解决

步骤配置nginx服务器以提供静态资源zip文件的访问可以按照以下步骤进行:安装并配置Nginx:首先确保已正确安装和配置了Nginx服务器。你可以从Nginx官方网站下载和安装Nginx,然后根据操作系统的要求进行配置。准备静态资源zip文件:将你的静态资源文件打包成一个zip文件,确保zip文件中包含了你想要提供给

操作系统基本概念

目录一、基本概述二、操作系统的特点(一)并发性(实质是微观的串行、宏观的并行)1.对比看:并行性2.单核CPU和多核CPU(二)共享性(三)虚拟性(四)异步性三、操作系统的功能(一)用户与硬件的接口1.命令方式2.系统调用方式3.图形、窗口方式(二)资源管理者1.处理机管理2.存储器管理3.I/O设备管理4.文件管理(

Wi-Blog 项目拆解(一):Maven项目的创建和常用Dependency配置

前言Maven是一个标准化的java项目管理和构建工具,其关键在于pom.xml文件内容。pom.xml中需要指定项目依赖,Maven会自动下载依赖的包并缓存到本地。对SpringBoot项目来说,其依赖关系大同小异,接下来将以Wi-Blog项目对每个包及其作用进行解析。Parent<parent><groupId>o

DC电源模块具有不同的安装方式和安全规范

BOSHIDADC电源模块具有不同的安装方式和安全规范DC电源模块是将低压直流电转换为需要的输出电压的装置。它们广泛应用于各种领域和行业,如通信、医疗、工业、家用电器等。安装DC电源模块应严格按照相关的安全规范进行,以确保其正常运行和安全使用。DC电源模块的安装方式主要有固定式和可调式两种。固定式DC电源模块的输出电压

Tomcat服务启动失败:java.lang.OutOfMemoryError: Java heap space

具体报错:java.lang.OutOfMemoryError:Javaheapspace报错分析:这个报错表明Java程序运行时内存不足。Tomcat服务在启动时需要占用一定的内存资源,如果分配的内存不足,就会出现该错误。通常情况下,出现该错误的原因是JVM的堆内存大小不足以支持Tomcat服务的启动。报错解决过程:

热文推荐