zoukankan      html  css  js  c++  java
  • 1的数目_扩展问题

    扩展问题:给定二进制数N,写下从1开始到N的所有二进制数,数一下其中出现的所有“1”的个数:
         f(1)=1
                  f(10)=10 (因为01,10,有两个1)
                  f(11)=100 (因01,10,11,有四个1)
    解答:考虑f(1011):1,10,11,100,101,110,111,1000,1001,1010,1011
                  第一位上:高位数为101,每两个数就出现一个1,则出现101个1;且current位为1,低位数为0,所以5+1=6
           第二位上:高位数为10,每四个数出现一个1,则出现(10)*2=4个1;且current位为1,低位数为1,所以4+1+1=6
           第三位:高位数为1,出现(1)*2^2=4个1;且current位为0,低位数为11;所以4+0=4
               第四位:高位数为0,,current位为1,低位数为011;所以为 低位数+1=4
    通过观察发现在 current==1 时,第n位上出现1的次数 = 高位数*2^n-1 +低位数+1
              current==0 时,第n位上出现1的次数 = 高位数*2^n-1

    附:

    十进制 二进制 最右边1的个数总和 倒数第二1的个数总和  倒数第三1的个数总和 倒数第四1的个数总和 倒数第五1的个数总和 十进制 二进制 最右边1的个数总和 倒数第二1的个数总和 倒数第三1的个数总和 倒数第四1的个数总和 倒数第五1的个数总和
    0 00000 0 0 0 0 0 13 01101 7 6 6 6 0
    1 00001 1 0 0 0 0 14 01110 7 7 7 7 0
    2 00010 1 1 0 0 0 15 01111 8 8 8 8 0
    3 00011 2 2 0 0 0 16 10000 8 8 8 8 1
    4 00100 2 2 1 0 0 17 10001 9 8 8 8 2
    5 00101 3 2 2 0 0 18 10010 9 9 8 8 3
    6 00110 3 3 3 0 0 19 10011 10 10 8 8 4
    7 00111 4 4 4 0 0 20 10100 10 10 9 8 5
    8 01000 4 4 4 1 0 21 10101 11 10 10 8 6
    9 01001 5 4 4 2 0 22 10110 11 11 11 8 7
    10 01010 5 5 4 3 0 23 10111 12 12 12 8 8
    11 01011 6 6 4 4 0 24 11000 12 12 12 9 9
    12 01100 6 6 5 5 0 25 11001 13 12 12 10 10
  • 相关阅读:
    Mac Atom的PHP插件
    WebStorm mac下如何安装WebStorm + 破解
    PHP接收json格式的POST数据
    mysqldump 导出统一限制每张数据表导出的记录数
    centos7下git服务器端搭建
    nginx服务器常见错误代码500、501、502、503、504、505
    【原创】PHPstorm本地修改同步保存到远程服务器
    SVN Checkout 不包括源文件夹根目录
    mac终端显示日历信息命令
    PHP生成唯一RequestID类
  • 原文地址:https://www.cnblogs.com/sooner/p/2995755.html
Copyright © 2011-2022 走看看