算法题:求二进制位中0的个数

#include <iostream>
using namespace std;
//古有求二进制数中1的个数,今有求二进制中0的个数。
int Grial(int x)
{
    int count = 0;
    while (x + 1)
    {
        count++;
        x |= (x + 1);
    }
    return count;
}
int main()
{
    cout << Grial(1) << endl;
    return 0;
}
//为了方便验证,我把求二进制数中1的个数也写下来。
#include <iostream>
using namespace std;

int Grial(int x)
{
    int count = 0;
    while (x)
    {
        count++;
        x &= (x - 1);
    }
    return count;
}
int main()
{
    cout << Grial(3) << endl;
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-16 09:47:16

算法题:求二进制位中0的个数的相关文章

51nod_1003 阶乘后面0的数量(求N!中5的个数,数论)

题意: n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) OutPut 输出0的数量 思路: 一个0只能由2*5得到.统计N!中2的个数和5的个数,取少的.即求N!中5的个数.[数论:[N/5]+[N/5^2]+[N/5^3]+[N/5^4]+....]{也自己分析也可以得出此结论} 代码: int main(){ int n; cin >> n; ll ans=0; ll tmp

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

(算法)求数组中出现频率最高的数

不准备实现算法先,根据21题和前辈的经验,这道题的真正考核点不在于解决这个问题,而在于拿到这个问题以后题的问题. 正常的一个做法,一次扫描然后用HASHMAP进行一个统计,然后再扫描一次HASHMAP获得频率最高的数.时间是O(N)空间也是O(N). 还有一种是做排序,然后扫描一次根据下标计算可以得到频率最高的数(可以避免空间消耗?). (不知道是否还有别的做法?) 据说我们应该先问这个数组是否已经排序?(想得美) 然后是否已经知道这个数的大概出现频率(比如说超过一半) 是否可以用额外空间?是否

编程之美-02数字之魅-求二进制数中1的个数

题目:求二进制数中 1 的个数 对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 解法一:移位->判断->累计 解法二:除2->判断->累计 解法三:v &= (v -1)需要掌握 ? 2 3 4 5 6 7 8 int num = 0; while(v) {     v &= (v -1);     num++; } return num; ? 2   解法四:分支操作(swicth-cas

求二进制数中1的个数——引发的问题

<编程之美>书中有这样的一道问题“求二进制数中1的个数” 题目:对于一个字节(8bit)的无符号整形变量,求其二进制中“1”的个数,要求算法的执行效率尽可能高. 我使用java语言处理:输出结果是3 public class Count { public static int Count(byte d){ int num = 0; while (d != 0) { d &= (d-1);//比较1的个数 num++; } return num; } public static void

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

Acdream1084 寒假安排 求n!中v因子个数

题目链接:点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStatistic Next Problem Problem Description 寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行. 假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),