统计二进制中1的个数(四种方案)

方案一:(只适合计算正数)

#include<stdio.h>

#include<stdlib.h>

int main()

{

int num = 10;  //10的二进制数为1010

int count = 0;

while (num)

{

if (num % 2 == 1)    //从最高位开始除,余数为1则为1,余数为2则为0

{

count++;     //余数为1时计数加1

}

num = num / 2;      //除以2相当于右移一位,即丢掉计数过的

}

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

system("pause");

return 0;

}

方案二:(正负数皆可)

#include<stdio.h>

#include<stdlib.h>

int main()

{

int num = 10;

int count = 0;

while (num)

{

if ((num&1) == 1)  //&按位与:有0则0,双1则1。即从最高位开始每位数字按位与1

{

count++;

}

num = num >> 1;  //相当于除以2

}

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

system("pause");

return 0;

}

方案三:(正负数皆可)

#include<stdio.h>

#include<stdlib.h>

int main()

{

unsigned int num = -1;  //-1的二进制数为11111111 11111111 11111111 11111111

int count = 0;

while (num)

{

if ((num&1) == 1)

{

count++;

}

num = num >> 1;

}

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

system("pause");

return 0;

}

方案四:(正负数皆可)

#include<stdio.h>

#include<stdlib.h>

int main()

{

int num = -1;

int count = 0;

while (num)

{

count++;

num = num&(num - 1);

}

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

system("pause");

return 0;

}

结果:

num=10             //10的二进制数为1010

num=-1              //-1的二进制数为11111111 11111111 11111111 11111111

时间: 2024-10-15 20:37:24

统计二进制中1的个数(四种方案)的相关文章

统计二进制中1的个数

本文提供了三种方法,分别计算一个数的二进制表示中1的个数.方法和解释分别见Count1, Count2, Count3函数. 只有Count1不能满足负数要求(会死循环进去),其他两个都可以操作32b以内正负数. Count1:每次将x末位与1相与,看最后以为是否为1, 然后将x右移 Count2:将变量y从1开始与x相与,然后每次将y左移,和上个方法类似 Count3:每次将x&=(x-1)可以将最右边一个1变为0; 该方法应用:e.g. 如何用一个语句判断一个整数是不是2的整数次幂? /**

统计二进制中1的个数(LeetCode 461. 汉明距离 or LeetCode 191. 位1的个数)

题目一 LeetCode 461.明距离(Hamming Distance) 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目.给出两个整数 x 和 y,计算它们之间的汉明距离. 注意 0 ≤ x , y < 231. 原文地址:https://www.cnblogs.com/hglibin/p/8984777.html

【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(

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

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

ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.

#include<stdio.h> //每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多. /* 样例输入: 样例输出: 1 2 2 4 3 5 4 8 78 83 0 */ //78的二进制位1001110,有4个1:83比78大且83的二进制位1001011也是4个1. int main() { int count1,count2;//count1统计原数据对应的二进制中1的个数,count2... int a[100];//存输入的数字 int i=

剑指Offer:二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h> int wrong_count_1_bits(int n) // 错误解法: 当n为负数时, n>>=1右移, 最高位补1, 陷入死循环 { int count = 0; while(n) { if( n & 1 ) ++count; n >>= 1; } return count; } int count_1_bits(int n) // 常规解法

Algorithm --&gt; 二进制中1的个数

行文脉络 解法一——除法 解法二——移位 解法三——高效移位 解法四——查表 扩展问题——异或后转化为该问题 对于一个字节(8bit)的变量,求其二进制“1”的个数.例如6(二进制0000 0110)“1”的个数为2,要求算法效率尽量高. 解法一 对于二进制数来说,除一个2,就少一位,可以判断这个少的位来确定“1”的个数. 例如:6(0000 0110) 0000 0110 / 2 = 0000 0011     ----少的一位为0 0000 0011 / 2 = 0000 0001    

Java之一个整数的二进制中1的个数

这是今年某公司的面试题: 一般思路是:把整数n转换成二进制字符数组,然后一个一个数: private static int helper1(int i) { char[] chs = Integer.toBinaryString(i).toCharArray(); int res = 0; for (int j = 0; j < chs.length; j++) { if (chs[j] == '1') { res++; } } return res; } 第二种方法是:将整数n与1进行与运算,

[剑指Offer]12.二进制中1的个数

题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 12.二进制中1的个数 * 结果:AC * 网址:http://www.nowcoder.com/books/coding-int