吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3420|回复: 4
收起左侧

[C&C++ 转载] 神奇的位运算(计算二进制中1的个数)

[复制链接]
caoxiaolin 发表于 2018-8-29 11:27
发现一个好玩的算法


[C] 纯文本查看 复制代码
#include <stdio.h>

//方法1
int count_ones(int num)
{
	int count = 0;
	
	while(num > 0)
	{
		if(num & 01 == 1)
		{
			++count;
		}
		
		num >>= 1;
	}
	
	return count;
}

//方法2
int count_ones2(int a)
{
	int m_1 = 0x55555555; // 01 01 01 ..
	int m_2 = 0x33333333; // 0011 0011 ..
	int m_4 = 0x0f0f0f0f; // 0000 1111
	int m_8 = 0x00ff00ff; // 00000000 11111111
	int m_16 = 0x0000ffff;// 0000... 1111...
	
	int b = (a & m_1) + ((a >> 1)&m_1);
	int c = (b & m_2) + ((b >> 2)&m_2);
	int d = (c & m_4) + ((c >> 4)&m_4);
	int e = (d & m_8) + ((d >> 8)&m_8);
	int f = (e & m_16) + ((e >> 16)&m_16);
	
	return f;
}

int main(void)
{
	int num = 9;
	int ret;
	
	ret = count_ones(num);
	printf("%d\n", ret);
	
	ret = count_ones2(num);
	printf("%d\n", ret);
	
	return 0;
}





哈哈,自己画了个图


统计二进制中有多少个1.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kk1212 发表于 2018-8-29 12:06
楼主你这个算法主要是用于什么场景呢,游戏还是?
happyqq521 发表于 2018-8-29 12:08
你需要剑指offer
int TheNumOf1(unsigned int num)
{
        int count = 0;
        while (num)
        {
                num = num&(num - 1);
                count++;
        }
        return count;
 楼主| caoxiaolin 发表于 2018-8-29 16:18
peachglide 发表于 2018-8-30 16:51
方法2很精妙,不用循环就可以得出,主要用于相似度算法
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 20:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表