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

趣题【高级的位运算】题解

ETOI_ 团队 原创题目,团队招人中…

U673078 Seeking

题目描述

已知x xx,求最小的y yy,使得x ⊕ y x \oplus yxyx & y x \& yx&y均不等于0 00

输入格式

本题共有T TT组数据。

第一行T ( 1 ≤ T ≤ 10 5 ) T(1\leq T\leq 10^5)T(1T105)

接下来的每一组数据,输入一个x xx以询问答案。

输出格式

对于每一个询问的答案,用换行隔开。

输入输出样例 #1

输入 #1

1 1

输出 #1

3

说明/提示

1 ≤ x ≤ 10 18 1\leq x\leq 10^{18}1x1018

本题数据较水,欢迎各种解法。

题解

暴力

#include<iostream>#defineullunsignedlonglongusingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(0);intT;cin>>T;while(T--){ull x;cin>>x;ull y=1;// 暴力查找最小的ywhile(true){if((x^y)!=0&&(x&y)!=0){cout<<y<<"\n";break;}y++;}}return0;}

结果:TLE。

显然暴力的方法是行不通的。

正解

看到亦或和与,知道这是一道位运算的题。暴力枚举浪费了很多时间,肯定是行不通的。

思路:位运算+分类讨论


分类讨论

1.x = 1 x = 1x=1

结论x = 1 x = 1x=1时,y = 3 y = 3y=3


2.x > 1 x > 1x>1且为奇数

y = 1 y = 1y=1

结论:奇数x > 1 x > 1x>1时,y = 1 y = 1y=1


3.x xx是 2 的幂(x = 2 k , k ≥ 1 x = 2^k, k \geq 1x=2k,k1

y = x + 1 y = x + 1y=x+1

检查更小的y yy

结论x xx是 2 的幂时,y = x + 1 y = x + 1y=x+1


4. 一般偶数(非 2 的幂)

lowbit ( x ) = x & ( − x ) \text{lowbit}(x) = x \& (-x)lowbit(x)=x&(x),即x xx的最低位的 1。

y = lowbit ( x ) y = \text{lowbit}(x)y=lowbit(x)

检查比lowbit ( x ) \text{lowbit}(x)lowbit(x)更小的y yy
这些数的二进制位都在lowbit ( x ) \text{lowbit}(x)lowbit(x)的右侧,而x xx在这些位上都是 0,因此x & y = 0 x \& y = 0x&y=0,不满足条件。

结论:一般偶数时,y = lowbit ( x ) y = \text{lowbit}(x)y=lowbit(x)


时间复杂度

每个查询O ( 1 ) O(1)O(1),总复杂度O ( T ) O(T)O(T),可轻松通过T ≤ 10 5 T \leq 10^5T105


代码实现

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(0);intT;cin>>T;while(T--){longlongx;cin>>x;if(x==1){cout<<"3\n";continue;}longlonglowbit=x&-x;if(lowbit==x){// 2的幂且 >1cout<<x+1<<'\n';}else{cout<<lowbit<<'\n';}}return0;}//记得开 long long

什么是 lowbit?

lowbit是一个常用的二进制运算术语,表示一个数在二进制表示中最低位的 1 所对应的数值


数学定义

lowbit ( x ) = x & ( − x ) \text{lowbit}(x) = x \& (-x)lowbit(x)=x&(x)

其中:


直观理解

例如x = 12,二进制是1100

所以lowbit(12) = 4


计算原理

x & (-x)为什么能得到最低位的 1?

x = 121100)为例:

  1. x的二进制:...1100
  2. -x的计算:先取反...0011,再加 1 得...0100
  3. x & (-x)
    12: 1100 -12: 0100 (实际高位全是1,这里简写) 与运算: 0100 = 4

关键在于:-x保留了x最低位的 1,并将更高位全部取反,所以x & (-x)只剩下最低位的 1。


常见性质

性质说明
lowbit(x)一定是 2 的幂因为只保留了一个 1
lowbit(x) ≤ x最低位不会超过数本身
如果x是奇数,lowbit(x) = 1最低位就是 2⁰
如果x是 2 的幂,lowbit(x) = x整个数只有一个 1

应用场景

  1. 树状数组(Fenwick Tree):核心操作就是lowbit
  2. 二进制枚举子集:用于遍历所有子集
  3. 本题:找到最小的与x有公共 1 位的数

例子对照表

x (十进制)x (二进制)lowbit(x)lowbit(x) 二进制
1111
210210
31111
41004100
510111
6110210
711111
8100081000
101010210
1211004100
141110210

代码实现

// 方法1:直接运算longlonglowbit(longlongx){returnx&-x;}// 方法2:用位运算逐步演示longlonglowbit_demo(longlongx){returnx&(~x+1);// ~x + 1 就是 -x}

总结

lowbit = 最低位的 1 所代表的数值

一句话记忆:lowbit(x) = x & (-x),它能把一个数"砍"到只剩下最右边的一个 1。

http://www.jsqmd.com/news/692356/

相关文章:

  • 科学记忆算法驱动的Windows通知栏英语学习工具完整解析
  • 输入法词库迁移终极解决方案:3步搞定跨平台格式转换难题
  • 支付宝立减金成功回收必备条件 - 米米收
  • 告别盲调!手把手教你用CANape和XCP on CAN给ECU做‘体检’(附实战报文解析)
  • B站成分检测器:智能识别评论区用户身份的终极指南
  • 深入解析Free-NTFS-for-Mac架构:事件驱动与混合检测模式下的性能优化实战
  • 别再手动写Arduino代码了!用LabVIEW图形化编程,10分钟搞定温湿度传感器数据采集
  • 【AI 应用架构基础】4.7_章节实战(一):构建一个带记忆的对话系统
  • 2026年厦门短视频代运营与企业获客:完整选型指南与官方联系方式 - 优质企业观察收录
  • C#上位机开发:用S7.Net.DLL给西门子S7-200Smart做个简易数据监控界面(读写/批量读/状态显示)
  • 基于Keras的CNN手写数字识别实战指南
  • #2026最新防脱洗发水公司推荐!广东优质权威榜单发布,实力靠谱广州防脱洗发水公司推荐 - 十大品牌榜
  • 抖音批量下载器:从手动保存到智能收集的完整解决方案
  • 2026届最火的五大降重复率平台实测分析
  • WPF实现双击修改文本内容
  • SAP预付款(Down Payment)配置实操:从OBYR到F-48,手把手搞定供应商预付款流程
  • 给AURIX TC3XX新手的内存映射避坑指南:从PFI到LMU,一次搞懂所有内存段
  • ESP32-S3 + LVGL 8.4 优化实战:从卡顿崩溃到丝滑35+FPS(TileView场景)
  • 像搭积木一样玩转Endnote:手把手教你从零编辑一个专属的参考文献Output Style
  • 不在传统RAG上雕花,这个思路让RAG不用一个人扛了
  • RWKV7-1.5B-world金融科技:跨境支付监管政策双语解读生成系统
  • 边缘计算架构:TDengine 时序数据库在制造业边缘节点的部署实践
  • 告别Docker Daemon:Podman + Systemd 实现容器开机自启的完整配置流程(含root与普通用户差异详解)
  • 2026年申论辅导机构排名榜,博越公考名列前茅 - 工业设备
  • 从零到一:手把手教你用Java和Modbus4j搞定工业传感器数据采集(附完整代码)
  • 老游戏手柄的重生之旅:XOutput如何让经典手柄焕发新生
  • DLSS Swapper深度解析:游戏超采样技术管理实战指南
  • 【Docker 27跨平台镜像兼容性终极指南】:20年运维专家实测ARM/x86/Apple Silicon 7类OS、12种Runtime组合的376次构建验证
  • 别让闲置的支付宝红包套装,悄悄变成过期的遗憾 - 团团收购物卡回收
  • 从原理到调试:一个视频教会你搞定BLE天线匹配网络(附Smith圆图实战)