zoukankan      html  css  js  c++  java
  • 二进制总结(算法竞赛进阶指南)

    常用操作

    最右一位为第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<<j)][k] + w[k][j]);
    printf("%d
    ", f[(1<<n)-1][n-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)也可以

  • 相关阅读:
    Nebula通关指南
    hackersonlineclub.com
    PHP设计的超强大的文件上传类(单文件上传)
    PHP面向对象实例(图形计算器)
    DIV+CSS布局网站基本框架
    python的threading模块
    Python 命令行参数和getopt模块详解
    python optparse模块
    python的sys模块
    python实现简单的netcat
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819345.html
Copyright © 2011-2022 走看看