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

位运算【入门-->精通】

什么是位运算

位运算(Bit Operation):在计算机内部,数是以二进制的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。

位运算的运算操作

在这里插入图片描述

一些重要的点

有效数字包括整数部分和小数部分

运算符

^ 异或 :相同为0,相异为1
& 与 :两个都为1时,结果为1,否则为0
| 或 :两个都为0时,结果为0,否则为1

移位运算

<< : 左移
在二进制表示下把数字同时向左移动,低位以0填充,高位越界后舍弃。
1<<n= 2^n
a<<1=a*2
>> : 右移
a>>1=a/2

位运算判断奇偶

与1相与

  • 为0则是偶数 a&1=0
  • 为1则是奇数 a&1=1

位运算实现对p取余

(p为2^k)
a对p取余:a&(p-1)

统计二进制中1的个数

lowbit

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

  • x=1010 lowbit(x)=10
  • x=101000 lowbit(x)=1000
    原理: x&-x=x&(~x+1)
    ~x: 对x取反
    下面举例说明:

x=101010000
~x=010101111
~x+1=010110000
x&(~x+1)=000010000
统计二进制中1的个数

int count(int x)
{int ans=0;while(x){x=x&(x-1);ans++;}return ans;
}

原码反码补码

32位无符号整数 :unsigned int
32位有符号整数 :int
举例:x=1010

  • 原码:0…01010
  • 反码:1…10101
  • 补码:1…10110(取反+1)

相关例题

题目来源:二进制中1的个数
在这里插入图片描述
模板没什么好说的。

#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{return x&-x;
}
int main()
{int n,ans=0;cin>>n;while(n){n-=lowbit(n);ans++;}cout<<ans<<endl;return 0;} 

P2114 [NOI2014] 起床困难综合症

题目来源:P2114 [NOI2014] 起床困难综合症

题目描述

21 21 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳。作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争。通过研究相关文献,他找到了该病的发病原因:在深邃的太平洋海底中,出现了一条名为 drd 的巨龙,它掌握着睡眠之精髓,能随意延长大家的睡眠时间。正是由于 drd 的活动,起床困难综合症愈演愈烈,以惊人的速度在世界上传播。为了彻底消灭这种病,atm 决定前往海底,消灭这条恶龙。历经千辛万苦,atm 终于来到了 drd 所在的地方,准备与其展开艰苦卓绝的战斗。drd 有着十分特殊的技能,他的防御战线能够使用一定的运算来改变他受到的伤害。具体说来,drd 的防御战线由 n n n 扇防御门组成。每扇防御门包括一个运算 o p op op 和一个参数 t t t,其中运算一定是 OR , XOR , AND \text{OR},\text{XOR},\text{AND} OR,XOR,AND 中的一种,参数则一定为非负整数。如果还未通过防御门时攻击力为 x x x,则其通过这扇防御门后攻击力将变为 x o p t x~op~t x op t。最终 drd 受到的伤害为对方初始攻击力 x x x 依次经过所有 n n n 扇防御门后转变得到的攻击力。

由于 atm 水平有限,他的初始攻击力只能为 0 0 0 m m m 之间的一个整数(即他的初始攻击力只能在 0 , 1 , … , m 0,1,\ldots,m 0,1,,m 中任选,但在通过防御门之后的攻击力不受 m m m 的限制)。为了节省体力,他希望通过选择合适的初始攻击力使得他的攻击能让 drd 受到最大的伤害,请你帮他计算一下,他的一次攻击最多能使 drd 受到多少伤害。

输入格式

输入文件的第 1 1 1 行包含 2 2 2 个整数,依次为 n , m n, m n,m,表示 drd 有 n n n 扇防御门,atm 的初始攻击力为 0 0 0 m m m 之间的整数。

接下来 n n n 行,依次表示每一扇防御门。每行包括一个字符串 o p op op 和一个非负整数 t t t,两者由一个空格隔开,且 o p op op 在前, t t t 在后, o p op op 表示该防御门所对应的操作, t t t 表示对应的参数。

输出格式

输出一行一个整数,表示 atm 的一次攻击最多使 drd 受到多少伤害。

输入 #1

3 10
AND 5
OR 6
XOR 7

输出 #1

1

说明/提示

【样例说明】

atm 可以选择的初始攻击力为 0 , 1 , … , 10 0,1,\ldots ,10 0,1,,10

假设初始攻击力为 4 4 4,最终攻击力经过了如下计算

  • 4 AND  5 = 4 4 \text{ AND } 5 = 4 4 AND 5=4
  • 4 OR  6 = 6 4 \text{ OR } 6 = 6 4 OR 6=6
  • 6 XOR  7 = 1 6 \text{ XOR } 7 = 1 6 XOR 7=1

类似的,我们可以计算出初始攻击力为 1 , 3 , 5 , 7 , 9 1,3,5,7,9 1,3,5,7,9 时最终攻击力为 0 0 0,初始攻击力为 0 , 2 , 4 , 6 , 8 , 10 0,2,4,6,8,10 0,2,4,6,8,10 时最终攻击力为 1 1 1,因此atm的一次攻击最多使drd受到的伤害值为 1 1 1

【数据规模与约定】

  • 特殊性质 A \mathrm A A:存在一扇防御门为 AND 0 \texttt{AND 0} AND 0
  • 特殊性质 B \mathrm B B:所有防御门的操作均相同。

对于所有数据,保证 2 ≤ n ≤ 1 0 5 2\le n\le 10^5 2n105 0 ≤ m ≤ 1 0 9 0\le m\le 10^9 0m109 0 ≤ t ≤ 1 0 9 0\le t\le 10^9 0t109,且 o p \mathrm{op} op 一定为 AND , OR , XOR \verb!AND!,\verb!OR!,\verb!XOR! AND,OR,XOR 中的一种。
解题思路
这题是让我们选择一个不大于m的整数x0,进行给定的n次位运算,使结果mx最大。
也就是对于任意的k(0<=k<=30),ans的第k位填0还是填1使这个数最大,依次从高位到低位考虑x0的每一位填0还是填1.
填1的条件

  • 1.已经填好的更高位构成的数值加上1<<k后不超过m
  • 2.用每个参数的第k位参与位运算,若初值为1,则n次位运算后的结果为1,若初值为0,则n次位运算后的结果为0
    填0的情况
  • 填1会超过m的范围
  • 填1不如填0更优
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int N=1e5+5;
pair<string,int>a[N];
int n,m;
int cal(int bit,int num)
{for(int i=0;i<n;i++){int bitv=(a[i].se>>bit)&1;if(a[i].fi=="AND")num=num&bitv;else if(a[i].fi=="OR")num=num|bitv;elsenum=num^bitv; 
}return num;} 
signed main()
{cin>>n>>m;for(int i=0;i<n;i++)cin>>a[i].fi>>a[i].se;int mx=0,x=0;for(int i=30;~i;i--)//最大的数不超过2^30 {int ans0=cal(i,0);//当前位填0 int ans1=cal(i,1);//当前位填1 if(x+(1<<i)<=m&&ans1>ans0)//如果填1不超过m并且比填0大,就填1{x+=1<<i;mx+=ans1<<i; }elsemx+=ans0<<i;
}cout<<mx<<endl;return 0;} 

P10447 最短 Hamilton 路径

P10447 最短 Hamilton 路径

题目描述

给定一张 n n n 个点的带权无向图,点从 0 ∼ n − 1 0 \sim n-1 0n1 标号,求起点 0 0 0 到终点 n − 1 n-1 n1 的最短 Hamilton 路径。

Hamilton 路径的定义是从 0 0 0 n − 1 n-1 n1 不重不漏地经过每个点恰好一次。

输入格式

第一行输入整数 n n n

接下来 n n n 行每行 n n n 个整数,其中第 i i i 行第 j j j 个整数表示点 i − 1 i-1 i1 j − 1 j-1 j1 的距离(记为 a [ i − 1 , j − 1 ] a[i-1,j-1] a[i1,j1])。

对于任意的 x , y , z x,y,z x,y,z,数据保证 a [ x , x ] = 0 , a [ x , y ] = a [ y , x ] a[x,x]=0,a[x,y]=a[y,x] a[x,x]=0a[x,y]=a[y,x] 并且 a [ x , y ] + a [ y , z ] ≥ a [ x , z ] a[x,y]+a[y,z] \ge a[x,z] a[x,y]+a[y,z]a[x,z]

输出格式

输出一个整数,表示最短 Hamilton 路径的长度。

输入 #1

5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0

输出 #1

18

说明/提示

对于所有测试数据满足 1 ≤ n ≤ 20 1 \le n \le 20 1n20 0 ≤ a [ i , j ] ≤ 1 0 7 0 \le a[i,j] \le 10^7 0a[i,j]107
解题思路
。。。以后再补。。。

相关文章:

  • Github 2025-05-13 Python开源项目日报 Top10
  • 我喜欢的vscode几个插件和主题
  • Datawhale 5月llm-universe 第1次笔记
  • 武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集
  • SpringBoot的外部化配置
  • 无人机避障——如何利用MinumSnap进行对速度、加速度进行优化的轨迹生成(附C++python代码)
  • API的学习总结(上)
  • 设计模式系列(03):设计原则(二):DIP、ISP、LoD
  • 记录算法笔记(2025.5.13)二叉树的最大深度
  • 【Qt】pro工程文件转CMakeLists文件
  • .NET8关于ORM的一次思考
  • MapReduce 入门实战:WordCount 程序
  • 2025.05.11阿里云机考真题算法岗-第三题
  • MapReduce打包运行
  • JavaEE--初识网络
  • OCR:开启财务数字化变革的魔法钥匙
  • 提示词设计模板(基于最佳实践)
  • springboot3+vue3融合项目实战-大事件文章管理系统-获取文章分类详情
  • BFS算法篇——从晨曦到星辰,BFS算法在多源最短路径问题中的诗意航行(上)
  • 【Android】下拉刷新组件Swiperefreshlayout
  • 孙卫东会见巴基斯坦驻华大使:支持巴印两国实现全面持久停火
  • 上海首发经济“卷”到会展业,浦东签约三个年度“首展”
  • “水运江苏”“航运浙江”,江浙两省为何都在发力内河航运?
  • 威尼斯建筑双年展总策划:山的另一边有什么在等着我们
  • 牛市早报|中美日内瓦经贸会谈联合声明公布
  • 马上评丨摆摊要交芙蓉王?对吃拿卡要必须零容忍