求一个数二进制中1的个数(优化)。判断一个数是不是2的n次方

求一个数二进制中1的个数:

一般方法:

#include<stdio.h>

#include<stdlib.h>

int   count_one_bits(unsigned int value)

{

int count = 0;

for (int i = 0; i < 32; i++)

{

if (value & 1 == 1)      (%2相当于&1)

{

count++;

}

value = value >> 1;      (右移一位相当于除2)

}

return count;

}

int main()

{

unsigned int value= 0;

scanf( "%d" , &value);

int ret = count_one_bits(value);

printf( "%d\n" , ret);

system( "pause" );

return 0;

}

优化:

#include<stdio.h>

#include<stdlib.h>

int  count_one_bits(unsigned int value)

{

int count = 0;

while (value )                         //value如果不为零则进入循环

{

count++;                     //因为value不为0,所以二进制中至少有一个1

value = value &(value - 1);     //n与n&(n-1)二进制中总是差一个1

}

return count;

}

int main()

{

unsigned int value= 0;

scanf( "%d", &value);

int ret = count_one_bits(value);

printf( "%d\n", ret);

system( "pause");

return 0;

}

求一个数书不是2的n次方:

#include<stdio.h>

int main()

{

int num=0;

scanf("%d",&num);

if((value &(value - 1))==0);

printf("yes\n");

else

printf("no\n");

return 0;

}

时间: 2024-07-30 13:40:18

求一个数二进制中1的个数(优化)。判断一个数是不是2的n次方的相关文章

【C语言】统计一个数二进制中1的个数

//统计一个数二进制中1的个数 #include <stdio.h> int count_one(int num) { int count = 0; while (num) { count++; num = num&(num - 1); //每次消去最后面的一个1,直至没有 } return count; } int main() { printf("%d\n", count_one(12)); printf("%d\n", count_one(

Binary system(求区间内二进制中1的个数最多的数)

Description 给定一个范围[a,b]  (0<=a<b<=10^18) 求出该范围内二进制中1的个数最多的数,如果存在多个答案,输出最小的那个数 Input 输入数据有多组,每组数据输入两个整数a,b,表示区间[a, b]. Output 输出该区间内二进制的1最多的整数,如果有多个数二进制1的个数相同,输出最小的那个数. Sample Input 4 87 14 Sample Output 77 HINT 思路: 区间[a,b],如果a==b,输出a, 先把a,b化为二进制数

不使用中间变量,交换变量的值。求一个数二进制中1的个数

1.给定两个整形变量的值,将两个值的内容进行交换.2. 不允许创建临时变量,交换两个数的内容(附加题)3. 求10 个整数中最大值.4. 写一个函数返回参数二进制中 1 的个数比如: 15       0000 1111       4 个 1程序原型:int  count_one_bits(unsigned int value){       // 返回 1的位数 } #include<stdio.h>#include<stdlib.h>void exchange(int *nu

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

POJ 3252 区间内一个数的二进制中0的数量要不能少于1的数量(数位DP)

题意:求区间内二进制中0的数量要不能少于1的数量 分析:很明显的是数位DP: 菜鸟me : 整体上是和数位dp模板差不多的 , 需要注意的是这里有前导零的影响 , 所以需要在dfs()里面增加zor 变量的限制条件 , 那么我们的dp[i][j] 是表示第i 位置 , ,0的数量减去1的数量不少于 j 的方案数 , 那剩下的就简单了咯 ,哦还需要注意的是 这里的 j 会出现负数的情况 , 那也很好解决咯 ,偏移下就好拉 , 从32开始 ,也就是说32表示0 #include<stdio.h>

第2章 数字之魅——求二进制中1的个数

求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1. 以10 100 010为例: 第一次除以2时,商为1 010 001,余为0. 第二次除以2时,商为101 000,余为1. 因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 假设该整数为i.首先i和1做与运算,判断i的最低位是不是为1.接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1.基于此,我们得到如下代码 int NumberOf1_Solution(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(

说一说,求一个正整数的二进制中0的个数

昨天突然看到一个算法题:一个正整数a的二进制中0的个数: 话说这是个老题了,直观的算法就每次右移一位,直到0为止:代码就省略了: 仔细想想有更好的方案么? 就是这个题可以转换成一个正整数~a的二进制中1的个数: 求1的个数这个貌似就很熟悉了吧: int num = 0; b = ~a; while(b){ num++; b = b & (b-1); } 是不是容易了许多呢 另外像java和python这种没有unsigned的语言要自己去转 b = ~a & 0x0ffff

求二进制中1的个数的五种方法

#include<iostream> using namespace std; //求二进制中1的个数:对于一个字节(8bit)的变量,要求算法的执行效率尽可能的高 //1,对于二进制,对2求余可得到这一位是0还是1 int count1(int v) { int num=0; while(v) { if(v%2==1) ++num; v=v/2; } return num; } //2.除2可用右移操作,提高效率,判断一位是否为1可用与来判别  int count2(int v) { int