获取二进制中1的个数
2016-07-18 21:02
453 查看
这是我写的第一种解决方案,你看看有什么问题^_^
这种解法是将数据n每次右移一位和1进行&运算来求得二进制中1的个数,对于无符号数来说没有问题,可是对于有符号数问题就大了,极有可能造成死循环。当n为负数时,n右移在最高位补1(为了保证数据为负数),因而最终就会形成死循环。
以下介绍两种比较好的解法:
常规解法: 移动的不是数据n而是1
此种解法不会担心陷入死循环,可以放心的求解出1的个数^_^
接下来这种解法是我觉得最好的解法,来看看吧^^ ^^
可能你没有看明白是怎么回事,来举个例子看看吧!!!
int NumberOf1(int n) { int count = 0; while(n){ if(n & 1){ count++; } n = n >> 1; } return count; }
这种解法是将数据n每次右移一位和1进行&运算来求得二进制中1的个数,对于无符号数来说没有问题,可是对于有符号数问题就大了,极有可能造成死循环。当n为负数时,n右移在最高位补1(为了保证数据为负数),因而最终就会形成死循环。
以下介绍两种比较好的解法:
常规解法: 移动的不是数据n而是1
int NumberOf1(int n) { int count = 0; unsigned int flag = 1; while(flag){ if(n & flag){ count++; } flag = flag << 1; } return count; }
此种解法不会担心陷入死循环,可以放心的求解出1的个数^_^
接下来这种解法是我觉得最好的解法,来看看吧^^ ^^
int NumberOf1(int n) { int count = 0; while(n){ count++; //只要n不为0则其至少有一个1 n = n & (n - 1); } return count; }
可能你没有看明白是怎么回事,来举个例子看看吧!!!
假如 n = 5 n 0101 5 n - 1 0100 4 n=n&(n-1) 0100 4 n - 1 0011 3 n=n&(n-1) 0000 0 进行了两次&运算,得到二进制5中的1的个数2。。。
相关文章推荐
- 【剑指offer】 面试题10: 二进制中1的个数
- Leetcode 338. Counting Bits
- 面试题10-二进制中1的个数
- 位运算
- 详解移位运算符-二进制中1的个数
- 求二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 位运算之统计一个整数的二进制中1的个数
- C语言中写一个函数返回参数二进制中 1 的个数
- 【九度OJ1513】|【剑指offer10】二进制中1的个数
- 面试题---二进制中1的个数
- 二进制整数中1的个数
- 算法学习记录九(C++)--->二进制中1的个数
- 剑指offer——二进制中1的个数
- 剑指offer:二进制中1的个数(java)
- 【赛码】将功赎过
- 元素出栈、入栈顺序的合法性/计算一个整数二进制位中1的个数。
- 剑指offer之二进制中1的个数
- 华为机试-查找输入整数二进制中1的个数