zoukankan      html  css  js  c++  java
  • 二进制数中1的个数

    题目:请设计一个函数,要求输入一个整数,然后输出此整数的二进制形式中1的个数,譬如:输入9(1001),输出2。

    本题考察二进制数的操作,共有五种操作,都是把十进制数转化为二进制数之后再进行的按位操作

    1、&操作:0&1=0、0&0=0、1&1=1、1&0=0;5&7=5

    2、|操作:0|1=1、0|0=0、1|1=1、1|0=1;5|7=7

    3、^操作:相异为1,相同为0;5^7=2

    4、<<左移操作:m<<2,表示把m的二进制形式数,向左移动两位,后边补0(相当于乘以2)(一般情况)

    5、>>右移操作:m>>2,表示把m的二进形式数,向右移动两位,若m最高位为1(负数),则在左边补1,若m最高位为0(正数),则在最左边补0

    ***有一个自己学过但居然忘了的东西要说一下(计组还得好好看啊)

    -1在计算机中二进制形式到底是几?11111111 or 10000001

    我居然第一次想都没想是10000001,但。。。计算机中是拿补码表示的(0.0),原码表示-1是10000001是对哒,但计算机会对10000001(负数),符号位不变,其他各位按位取反,得到反码11111110,然后再加1得到11111111,故-1中的1的个数在int型下是32个,而10000001表示的是-127。所以对于一个二进制数到底是几的问题?要看它是拿什么码表示的,然后再计算是几。。。

    上题有三种的解法,一个比一个进行了优化和完善。

    一、上图好了。。。

    二、

    三、

    具体的代码实现和测试用例

     1 #include<iostream>
     2 using namespace std;
     3 #include<stdlib.h>
     4 #include<stdio.h>
     5 int firstfind1(int n)
     6 {
     7     int c = 0;
     8     while (n)
     9     {
    10         if (n & 1)
    11             ++c;
    12         n = n >> 1;
    13     }
    14     return c;
    15 }
    16 int secondfind1(int n)
    17 {
    18     int c = 0;
    19     int flag = 1;
    20     while (flag)
    21     {
    22         if (n&flag)
    23             ++c;
    24         flag = flag << 1;
    25     }
    26     return c;
    27 }
    28 int thirdfind1(int n)
    29 {
    30     int c = 0;
    31     while (n)
    32     {
    33         ++c;
    34         n = n&(n - 1);
    35     }
    36     return c;
    37 }
    38 int main()
    39 {
    40     //cout << firstfind1(-1) << endl;//死循环
    41     /*
    42     cout << firstfind1(13) << endl;
    43     cout << secondfind1(13) << endl;
    44     cout << secondfind1(1) << endl;
    45     cout << secondfind1(0x70000000) << endl;
    46     cout << secondfind1(0x80000000)<<endl;
    47     cout << secondfind1(0x7FFFFFFF) << endl;
    48     cout << secondfind1(0xFFFFFFFF) << endl;
    49     cout << secondfind1(0x8FFFFFFF) << endl;
    50     */
    51     cout << secondfind1(-1) << endl;
    52     cout << thirdfind1(-1) << endl;
    53     cout << (5^7) << endl;//2
    54     cout << (5 | 7) << endl;//7
    55     cout << (5 & 7) << endl;//5
    56     system("pause");
    57     return 0;
    58 }

    总结:

  • 相关阅读:
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    Ural 1146 Maximum Sum(DP)
    [算法系列之四]优先级队列
    Python源代码--整数对象(PyIntObject)的内存池
    3星|何帆《猜测与偏见》:社科书评集
    4星|《认识经济》:全面系统的经济学普及读物,鸿篇巨制,价格超贵
    3星|《东方启动点》:民营企业家们的故事,故事多分析概括少
    2星|《大师的管理课》:畅销书作家们的35篇励志散文
    3.5星|《蓝海战略2》:实施蓝海战略的具体工具与方法。案例牵强且偏老旧
    2星|《读懂华为30年》:基于公开资料的整理和肤浅的发挥
  • 原文地址:https://www.cnblogs.com/General-up/p/5417534.html
Copyright © 2011-2022 走看看