位运算之二进制中1的个数

  1 /**
  2  参考的剑指offer
  3  */
  4 #include <stdio.h>
  5
  6 int numberOf1(int n);
  7 int betterNumberOf1(int n);
  8 _Bool judgeIs2Cifang(int n);
  9 int numberOfTransform(int m, int n);
 10
 11 int main(int argc, const char * argv[]) {
 12
 13     int n;
 14     int countOf1;
 15     int betterCountOf1;
 16     _Bool is2Cifang;
 17     int transformCount;
 18     int transM,transN;
 19
 20     while (1) {
 21         printf("请输入一个整数:\t");
 22         scanf("%d",&n);
 23         countOf1 = numberOf1(n);
 24         betterCountOf1 = betterNumberOf1(n);
 25         is2Cifang = judgeIs2Cifang(n) ? 1 : 0;
 26
 27
 28
 29
 30         printf("%d\t转换为二进制之后含有1的个数为\t%d\n\n",n,countOf1);
 31         printf("%d\t转换为二进制之后含有1的个数为\t%d\n\n",n,betterCountOf1);
 32         if(is2Cifang){
 33             printf("%d\t是2的整数次方\n\n",n);
 34         }else{
 35             printf("%d\t不是2的整数次方\t\n\n",n);
 36         }
 37
 38
 39         printf("输入待相互转化的两个数:\t");
 40         scanf("%d %d",&transM,&transN);
 41         transformCount = numberOfTransform(transM, transN);
 42         printf("%d和%d转化需要的次数是%d\n\n",transM,transN,transformCount);
 43
 44
 45
 46     }
 47
 48     return 0;
 49 }
 50
 51
 52 /**
 53  求1的个数
 54
 55  @param n 所求的数
 56
 57  @return 传进去的数的二进制形式中1的个数
 58  */
 59 int numberOf1(int n){
 60     int count = 0;
 61     while (n)
 62     {
 63         if ((n & 1)){
 64             count ++;
 65         }
 66         n = n >> 1;
 67
 68     }
 69     return count;
 70
 71
 72 }
 73
 74
 75 /**
 76  求一个数二进制形式中1的个数的更优解
 77
 78  @param n 传进去的待求的参数
 79
 80  @return 返回的待求参数的二进制形式中1的个数
 81  */
 82 int betterNumberOf1(int n){
 83
 84     int count = 0;
 85     while(n){
 86         count++;
 87         //每一次做下列操作都会使得这个待求的数的二进制的形式中少1个1 这样的好处是减少比较的次数
 88         n = n & (n-1);
 89     }
 90     return count;
 91 }
 92
 93
 94 /**
 95  相关的问题有:
 96     1.当判断一个数字a是否是2的整数次方的时候
 97     2.当判断给定的2个数m,n;
 98     每次改变二进制形式的1个1;
 99
100     m要经过几步转变为n的时候会用到异或;
101     异或的结果 的二进制的形式含有几个1 就需要相应的几步转换为对方。
102
103  */
104
105
106 /**
107  判断一个数是否是2的整数次方
108
109  @param n 传进去的待求参数
110
111  @return 返回的是布尔类型的是否是2的整数次方
112  */
113 _Bool judgeIs2Cifang(int n){
114
115     return (n & (n-1))? 0 : 1;
116 }
117
118
119
120 /**
121  两个数的二进制的形式相互转换的时候需要改动的次数
122
123  @param p 参数p
124  @param q 参数q
125
126  @return 返回p q相互转换所需的次数
127  */
128 int numberOfTransform(int p, int q){
129
130     int count = betterNumberOf1(p ^ q);
131     return count;
132
133
134
135 }
时间: 2024-11-05 17:18:28

位运算之二进制中1的个数的相关文章

剑指offer—算法之位运算(二进制中1的个数)

位运算: 左移:m<<n将m左移n位,左移后低位补充0: 右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF)) 题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数. 思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0:该算法的时间复杂度为输入的i的位数.

位运算:二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 代码一: public class Solution { public int NumberOf1(int n) { int count = 0; int flag = 1; while (flag != 0) { if ((n & flag) != 0) { count++; } flag = flag << 1; } return count; } } 最优代码: public class Solution { pu

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

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

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

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

【剑指offer】二进制中1的个数

题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 分析描述: 1.对一个整数的二进制形式,要想知道其中1的个数,首先想到的应该就是遍历整个二进制数,用到的方法当然就是移动了(包含左移或右移).例如,用1来跟给定的整数做与运算.如果结果为1,则证明整数的二进制形式中,最右边的一位是1,如果结果是0,则证明整数的二进制形式中,最右边的一位是0. int NumberOf1(int n) { int co

二进制中1的个数(2)

规律总结: 把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中最右边的一个1变为0. 题目1: 用一条语句判断一个整数是不是2的整数次方. 解决思路: 如果一个整数是2的整数次方,那么二进制表示中只有一位是1.将这个数减去1之后再与本身,结果为0则表示这个整数位2的整数次方. bool func(int n) { return ((n-1)&n)==0; } 题目2: 输入两个整数m,n.计算需要改变m的二进制表示中的多少位才能得到n. 思路: 先将m异或n,结

求一个整数的二进制中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(

剑指offer (10) 二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数. 我们可能很快写下如下代码: 1 int NumOf1InBinary(int n) 2 { 3 int count = 0; 4 while (n != 0) { 5 if (n & 1 ) { 6 ++count; 7 } 8 n >> 1; // bug!!! 9 } 10 return count; 11 } 第8行存在bug. 首先C/C++中数有无符号数和有符号数两种(我一直认为无符号数是个蛋疼的存在,滋生大量的bug) 左

剑指offer编程题Java实现——面试题10二进制中1的个数

题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变成0,与运算进行多少次就有多少个1. 1 package Solution; 2 /** 3 * 剑指offer面试题10:二进制中1的个数 4 * 题目:请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数. 5 * 例如,把9表示成二进制是1001,有2位是1,该函数输出2 6 * 解法