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

Python位运算技巧

"""
位运算技巧 — 直接操作整数二进制位
速度快,适合状态压缩、权限标记、性能关键代码
"""


def get_bit(n: int, p: int) -> int: return (n >> p) & 1
def set_bit(n: int, p: int) -> int: return n | (1 << p)
def clear_bit(n: int, p: int) -> int: return n & ~(1 << p)
def toggle_bit(n: int, p: int) -> int: return n ^ (1 << p)


def count_set_bits(n: int) -> int:
"""Brian Kernighan 算法:每次消除最低位的 1"""
c = 0
while n: n &= n - 1; c += 1
return c


def is_power_of_two(n: int) -> bool:
"""2 的幂:二进制只有一个 1"""
return n > 0 and (n & (n - 1)) == 0


def find_single_number(nums: list) -> int:
"""出现一次的数,其他成对出现(a ^ a = 0, a ^ 0 = a)"""
r = 0
for n in nums: r ^= n
return r


def swap(a: int, b: int) -> tuple:
"""不用临时变量交换两个整数"""
a ^= b; b ^= a; a ^= b; return a, b


def find_missing(arr: list, n: int) -> int:
"""0..n 中缺失的那个数,利用 XOR 性质"""
x = 0
for i in range(n + 1): x ^= i
for v in arr: x ^= v
return x


def subset_bitmask(nums: list) -> list:
"""用二进制位掩码枚举所有子集"""
res = []
for mask in range(1 << len(nums)):
res.append([nums[i] for i in range(len(nums)) if mask & (1 << i)])
return res


def demo():
n = 0b101101
print(f"原始: {bin(n)}")
print(f"get(2)={get_bit(n,2)}, set(4)={bin(set_bit(n,4))}")
print(f"clear(5)={bin(clear_bit(n,5))}, toggle(0)={bin(toggle_bit(n,0))}")
print(f"count 1s: {count_set_bits(n)}, 2的幂 16:{is_power_of_two(16)} 18:{is_power_of_two(18)}")
print(f"单身数: {find_single_number([4,1,2,1,2])}")
print(f"swap(3,5): {swap(3,5)}, 缺失: {find_missing([0,1,3,4], 4)}")
print(f"位掩码子集 [1,2]: {subset_bitmask([1,2])}")


if __name__ == "__main__":
demo()

http://www.rkmt.cn/news/1420666.html

相关文章:

  • Windows离线语音识别终极方案:TMSpeech如何彻底改变你的工作效率?
  • 自学程序员求职指南:从技能准备到面试通关的实战策略
  • 科研精密超低温工况怎么选?深圳保利德低温螺杆式冷冻机高精度更稳定 - 资讯纵览
  • EdgeRemover:专业卸载微软Edge浏览器的完整PowerShell解决方案
  • 2026年防泄密系统服务商实力盘点:华东地区值得信赖的品牌 - 速递信息
  • 如何高效获取同花顺问财数据:Python金融量化分析终极指南
  • 2026年上海美业培训深度横评:化妆美甲美发零基础到高薪就业全链路指南 - 年度推荐企业名录
  • COM3D2.MaidFiddler:终极游戏实时编辑器,5分钟快速定制你的女仆角色!
  • 如何解决GoB插件在Blender 4.3中的导入问题:5个终极技巧
  • 2026 东莞翡翠回收精选商户:专业团队鉴定,本地交易安全稳妥 - 薛定谔的梨花猫
  • FGA自动化神器:重新定义FGO安卓玩家的战斗体验
  • 如何永久保存你的微信聊天记录:开源解决方案完全指南
  • BERT uncased L-12 H-256 A-4在不同NLP任务上的表现评估:轻量级模型的终极指南
  • 5分钟学会SillyTavern:打造属于你的AI角色对话神器
  • Dart Simple Live:多平台直播聚合应用架构设计与实现方案
  • imFile:一款全能下载管理器如何彻底解决你的下载难题
  • 如何免费解锁WeMod Pro功能:终极Wand增强工具配置指南
  • 智慧树自动刷课插件:告别手动操作,开启高效学习新时代
  • 量子退火解决集合分割问题的QUBO建模与实践
  • AI时代人类情商危机:低情商社会如何成为AI的有毒训练集
  • WPS-Zotero插件:Linux科研工作者的文献管理救星
  • 小红书无水印内容采集完整指南:XHS-Downloader 开源工具深度解析
  • 如何快速上手Qwen3.6-35B-A3B-Claude-4.7-Opus-Reasoning-Distilled:5分钟安装与推理测试指南
  • 如何永久保存微信聊天记录?三步实现你的数字记忆守护计划
  • 终极指南:如何微调Qwen3.6-Heretic模型实现自定义训练与优化技巧 [特殊字符]
  • 华硕笔记本性能调优新选择:G-Helper 轻量级控制工具全面解析
  • Python自动化办公:用BoofCV库批量生成带Logo的二维码和微二维码,并自动解析Excel里的数据
  • DeBERTa V2 XLarge模型架构详解:24层1536隐藏大小的设计奥秘
  • Bilibili缓存视频合并终极指南:告别碎片化,轻松导出完整MP4
  • OpenClaw 源码解析(十三):Plugins 插件系统与能力扩展机制