zoukankan      html  css  js  c++  java
  • 10--输入一个十进制的整数,转化为二进制,输出有多少个1

    /*
    问题描述:
    输入一个十进制的整数,转化为二进制,输出有多少个1.
    
    解题思路:
        (1):位操作,然后移动光标。不是移动输入数字,而是移动flag。
            因为负数第一个为1,向右移动为了保证负数,所以填充为1,
            出现无限循环的可能。
        
        (2):第二种效率更高,二进制出现多少个1,就循环多少次。
                while (n)
                {
                    number++;
                    n = (n - 1) & n;
                }
    
    相关问题:
    (1)
    一条语句判断是不是2的整数次方。
                那就是判断是否只有一个1!
        if (n != 0 && (0 == (n - 1) & n))    printf("是2的整数次。
    ")
    
    
    (2)
    把一个整数减去1之后,再和原来的整数相与,得到新的数,相当于把原来的数字,最右面的1换成0。
        printf("%d", x&(x-1));
    
    */
    
    #include <stdio.h>
    
    int countOneInNum1(int x)
    {
        int number = 0;
        int i = 0;
        unsigned int flag = 1;        //无符号整型
        while (flag)
        {
            i++;
            if (x & flag)
                number++;
            flag = flag << 1;        //左移动flag
        }
    
        //循环了32次 int占4个字节, 4 * 8 = 32
        printf("循环了-- %d -- 次
    ", i);
        return number;
    }
    
    int countOneInNum2(int n)
    {
        int number = 0;
        while (n)
        {
            number++;
            n = (n - 1) & n;
        }
    
        return number;
    }
    
    
    int main()
    {
        int x;
        scanf("%d", &x);
    
        printf("%d
    ", countOneInNum1(x));
        printf("%d
    ", countOneInNum2(x));
    
        //把一个整数减去1之后,再和原来的整数相与,得到新的数,
        //相当于把原来的数字,最右面的1换成0。
        printf("%d
    ", x&(x-1));
    
        if (x != 0 && (0 == ((x - 1) & x)))    
            printf("%d是2的整数次。
    ", x);
    
        return 0;
    }
  • 相关阅读:
    AVL树
    快速排序
    基数排序LSD_Radix_Sort
    归并排序
    JDBC连接池与工具类
    cookie的基础以及小案例
    javase基础4
    tomcat的request和response小案例
    javase基础3
    Servlet以及一个简单的登录案例
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842552.html
Copyright © 2011-2022 走看看