博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二进制总结(算法竞赛进阶指南)
阅读量:7005 次
发布时间:2019-06-27

本文共 713 字,大约阅读时间需要 2 分钟。

常用操作

最右一位为第0位,从右到左依次为 0, 1, 2, 3…… 

取出n的第k位                              (n >> k) & 1
取出n的第0~k-1位                       n & ((1 << k) - 1)
n的第k位取反                              n ^ (1 << k) 
n的第k位赋值为1                         n | (1 << k)
n的第k位赋值为0                         n & (~(1 << k))

 

二进制状态压缩例题: 最短Hamliton路径

给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。

核心代码

int f[1 << 20][20];memset(f, 0x3f, sizeof(f));f[1][0] = 0;REP(i, 1, 1 << n)	REP(j, 0, n) if((i >> j) & 1)		REP(k, 0, n) if((i >> k) & 1)			f[i][j] = min(f[i][j], f[i^(1<

 

lowbit

表示非负整数n在二进制下最低位1以及它后面的0构成的数值

比如n = 1010101000100

lowbit(n) = 100

lowbit(n) = n & (-n)

 

快速求二进制中1的个数

int num(int x) { return !x ? 0 : 1 + num(x & (x - 1)); }

x & (x - 1) 可以把二进制中最后一位1去掉

比如10100变成10000

这里减去lowbit(x)也可以

 

转载于:https://www.cnblogs.com/sugewud/p/9819345.html

你可能感兴趣的文章
洛谷——2347砝码称重
查看>>
网络提速(最短路)
查看>>
洛谷——P2683 小岛
查看>>
python双端队列-collection模块
查看>>
Maven项目搭建(三):Maven直接部署项目
查看>>
git自定义项目钩子和全局钩子
查看>>
排球比赛计分规则
查看>>
SQL SERVER 2008 服务器登录名、角色、数据库用户、角色、架构的关系(转)
查看>>
关于DNS的总结
查看>>
ios动态创建类Class
查看>>
Python菜鸟之路:Python操作MySQL-即pymysql/SQLAlchemy用法
查看>>
sessionStorage微信返回上一页到历史浏览位置
查看>>
【leetcode】4Sum
查看>>
IDEA JSP项目构建及学习心得
查看>>
Java入门(四):运算符优先级、关键字与保留字
查看>>
快来秒杀我
查看>>
Linux和Windows回车符的不同及转换方法.
查看>>
本地文件系统命令
查看>>
SpringMVC_原理(转)
查看>>
KVM虚拟化之嵌套虚拟化nested
查看>>