基础算法--位运算

news2025/1/4 5:42:21
位运算理解:

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;
}

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

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

相关文章

本地Docker Registry远程连接,为你带来高效便捷的镜像管理体验!

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出

多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多输入多输出 1.data为数据集&#xff0c…

Python 判断三位水仙花数

"""判断是否为三位水仙花数知识点&#xff1a;0、水仙花满足条件&#xff1a;(1 ** 3) (5 ** 3) (3 ** 3) 1531、字符串索引&#xff0c;例如&#xff1a;name zhouhua name[0] z2、变量类型转换函数3、双目运算符幂**,例如&#xff1a;3 ** 2 3 * 3 94、…

【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

《关于如何防止edge浏览器偷取chrome浏览器的账号》 前段时间edge自动更新了&#xff0c;我并没有太在意界面的问题。但是由于我使用同一个网站平台时&#xff0c;例如b站&#xff0c;甚至是邮箱&#xff0c;edge的账号和chrome的账号会自动同步&#xff0c;这就导致我很难短时…

Linux su sudo命令

1、su命令——切换用户 1.1、切换到root用户(需要密码) su - root 1.2、切换到其他用户&#xff0c;比如jackma&#xff08;无需密码&#xff09; su - jackma 2、sudo命令——给普通用户添加root权限 2.1、用法 切换到root用户&#xff0c;执行visudo命令&#xff0c;会自动…

Leetcode 951. 翻转等价二叉树

文章目录 题目代码&#xff08;9.22 首刷部分看解析&#xff09; 题目 Leetcode 951. 翻转等价二叉树 代码&#xff08;9.22 首刷部分看解析&#xff09; class Solution { public:bool flipEquiv(TreeNode* root1, TreeNode* root2) {if(!root1 && !root2)return tr…

AI也需要透明度?是的,需要

文章目录 什么是AI透明度为什么需要AI透明度AI透明度的弱点如何做好AI透明度推荐阅读 什么是AI透明度 AI透明度指的是人工智能&#xff08;AI&#xff09;系统的工作原理和决策过程能够被理解、解释和追踪的程度。它包括以下几个方面&#xff1a; 可解释性&#xff08;Explai…

安装nvm 切换不同nodejs版本号

1.下载nvm:NVM下载 - NVM中文网 2.卸载node&#xff08;没有安装的可以直接跳过&#xff09; 3.安装 nvm list available 查看可安装的node版本nvm install 12.16.0 安装指定版本node nvm ls 查看已安装的node版本nvm use 16.13.0 切换…

第二证券:个人开证券账户要开户费吗?

随着互联网和移动端东西的遍及&#xff0c;越来越多的人开端涉足股票投资&#xff0c;开立证券账户也成为一个热门话题。但是&#xff0c;许多初学者或许会有疑问&#xff0c;个人开证券账户是否需求支付开户费呢&#xff1f;这个问题的答案并不是那么简略&#xff0c;需求考虑…

使用企业订货系统的原因和考虑|网上APP订单管理软件

使用企业订货系统的原因和考虑|网上APP订单管理软件 企业要用订货系统主要如下原因&#xff1a; 第一、在线订货系统能让销售即时看到商品信息。商品售价多少&#xff0c;进货价多少&#xff0c;上次跟客户的成交价是多少&#xff0c;最低可以卖多少钱&#xff0c;用个本子记录…

【论文阅读 05】图像异常检测研究现状综述

1 图像异常检测任务 图像异常检测任务根据异常的形态可以分为定性异常的分类和定量异常的定位两个类别. 定性异常的分类&#xff1a;整体地给出是否异常的判断&#xff0c;无需准确定位异常的位置。 如图2左上图所示, 左侧代表正常图像, 右侧代表异常图像, 在第1行中,模…

【一、虚拟机vmware安装】

安装虚拟机 下载 官方下载地址&#xff1a;https://www.vmware.com/cn.html 大概流程就是&#xff0c;最重要的事最后一步

YashanDB混合存储揭秘:行式存储如何为高效TP业务保驾护航(下)

上一篇文章https://mp.weixin.qq.com/s/mQLzi2PSZxqwwACSsq49ng为大家讲述了行式存储中事务并发控制的关键设计和优化。YashanDB采用了In-place Update 的块级 MVCC&#xff0c;能极大提高事务并发处理能力。本篇文章&#xff0c;我们将会详解插入性能优化和宽行存储的设计。 插…

夏日漫步(BFS)-- 2023百度之星初赛第二场

码蹄集 --原题链接 解析&#xff1a; BFS&#xff0c;每次只能前后&#xff0c;或者瞬移&#xff0c;并且每次消耗都为1&#xff0c;所以宽搜即可。 #include<bits/stdc.h> using namespace std; const int N2e55; int n,a[N],ne[N]; int vis[N],res; map<int,int>…

四、二叉树-上(Binary tree)

文章目录 一、算法核心思想二、算法模型&#xff08;一&#xff09;回溯1.[104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;复杂度分析 2.[144.二叉…

Blender导出FBX给UE5

最近在学习UE5的资源导入&#xff0c;总结如下&#xff1a; 建模使用Blender&#xff0c;UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可&#xff0c; UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

蔡司光学公益助童行动,以爱共创美好“视”界

2023年是蔡司光学坚持初心&#xff0c;号召视光行业与全社会关爱乡村学童视力健康的第十年&#xff0c;也是蔡司光学带领视光同行一起跋山涉水、走遍全国多地乡村学校&#xff0c;践行宗旨的第十年。点滴善意&#xff0c;汇聚成光。过去这十年间&#xff0c;蔡司光学一直在路上…

在uniapp中使用 秋云ucharts图表,运行到小程序

步骤一&#xff1a;通过使用 HBuilderX 直接导入项目&#xff08;uni_modules 版本&#xff09; 步骤二&#xff1a;在uCharts官网 - 秋云uCharts跨平台图表库 演示中&#xff0c;先弄个demo试着运行&#xff0c; 步骤三&#xff1a;查看自己需要的配置&#xff0c; 下面是我的…

通过Vue-cli搭建spa项目

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

Faunadb

Faunadb和google spanner都属于云分布式数据库天然支持分片(无需做分表分库操作&#xff0c;一库搞定&#xff0c;当然价格另说)&#xff0c;国内的也有比如TiDB Oceanbase等 本文使用java语言&#xff0c;其他语言可以跳过&#xff1b;有想直接使用的可以参考(无法访问外网&…