zoukankan      html  css  js  c++  java
  • 编程之美 2.1 求二进制数中1的个数

    如果有数n

    曾经用除二取余法 复杂度logn 不多说

    有一个logv的方法 v为1的个数 复杂度比logn小

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


    这里用到了位运算  x&(x-1)每次去掉一个1 举个样例 

    100010001000&(100010001000-1) = 100010000000

    100010000000&(100010000000-1) = 100000000000

    100000000000&(100000000000-1) = 000000000000

    总共3次 每次去掉一个1

    然后补充一下

    for(int i = s; i; i = (i-1)&s)

    这个循环枚举了全部s的子集 比如 S = 10101

    10101 -> 10100 -> 10001 -> 10000 -> 00101 ->00100 ->00001 -> 00000

    这样枚举了全部S的子集

    这个在状态压缩DP的时候会用到

  • 相关阅读:
    求树的重心
    牛客多校第七场B题
    高精度
    hdu 6763 Total Eclipse 并查集+思维
    substr用法
    置换群
    快速幂
    Winform+Mysql登录
    Rider C#连接MySQL
    C# winform组件
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4009619.html
Copyright © 2011-2022 走看看