这是我今天遇到的一个笔试题,那个时候我花了大概五分钟,想到了这么一个算法,我想应该是最高效率的了,但由于紧张,写的时候还是写错了。 我现在把他写上来,看看大家有没有比这个方法更好的。
int Count(int num) { int count = 0; while (true) { if ((num & -num) != 0) count++; else break; num &= num - 1; } return count; }
用位运算有个陷阱:int(有符号4字节整数)最高位是负号位,而且负数是2-补位表示的 所以
int Count(int num) { if (num == INT32_MIN) return 1; if (num < 0) return Count(-num); int count = 0; while (true) { if ((num & -num) != 0) count++; else break; num &= num - 1; } return count; }
int count(int n) { int count = 0; while(n){ count+=n&1; n>>=1; } return count; }
我之前在书中看到过这道题目,但没有去想。
现在再看的时候,第一个想到的办法是算被2整除的次数,容易理解,可能大多数人也是。
我博客上有人给了这个回答,我觉得比我的好得多哦。
int Count(int n) { int count = 0; while (n) { count++; n &= n - 1; } return count; }
作者是adrianx
int Count(int val) { int i = 1; int count = 0; while(val>i) { if (val != (val^i)) { count++; } i<<; } }
int Count(unsigned x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x & 0x0000003F; }
这个是二分法,不需要循环和判断,所以效率比较高。我以前写过一篇博文介绍数1的算法,可以参考下 http://techblog.iamzellux.com/2008/04/count-1-bits-in-an-int32/
您正在浏览的问题含有以下标签:
算法 × 7 趣味题 × 6
提问时间: 1 year前
目前浏览数量:915 次
最后更新时间:1 month, 3 weeks前
控制CPU占用率曲线为正弦曲线
一个整数 假如 123 换成二进制 数一下里面有几个一 设计算法
求算一任意长度字符串中不同的字符以及它的个数?
如何实现如Excel的单元格公式?
文字竖排算法(最高效或最易懂或最巧妙或兼而有之的)
以高效的方法输出二进制
怎样将一个二进制数倒序
一道面试题,关于杨辉三角形的