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的时候会用到

  • 相关阅读:
    redis-单线程为什么快
    redis-数据结构
    http-状态码
    事件绑定完整版2016/4/21
    焦点事件2016、4、21
    ++
    Bom2016/4/21
    添加以及删除className
    getByClassName2016/4/21
    动态添加
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4009619.html
Copyright © 2011-2022 走看看