zoukankan      html  css  js  c++  java
  • Delphi 判断一个二进制数中有多少个1

    技术交流,DH讲解

    有个朋友发短信来求助,我想他是在笔试.哈哈.C++的,但是我们知道原理后,什么都是一样的.


    一个数的二进制形式是这样的.
    10011001 那么要判断有多少个1的话,我们只要与
    00000001与,然后循环右移与就可以了.
    比如第一次:
    10011001 and 00000001 =1 说明这一位是1
    01001100 and 00000001 =0 说明这一位不是1
    再右移
    00100110 and 00000001 =0 这个又不是1
    好的来看看Delphi代码:
    Program Project2;
    {$APPTYPE CONSOLE}
    Uses
    SysUtils;
    Var
    I, N, C: Integer;
    Begin
    { TODO -oUser -cConsole Main : Insert code here }
    C := 9999;
    N := 0;
    For i := 0 To 32- 1 Do
    Begin
    If C And 1= 1 Then
    Inc( N );
    C := C Shr 1;
    End;
    writeln( N );
    Readln( N );
    End.
    判断9999里面有多少个1,因为我们用的integer,32位有符号整数,所以我们右移32次.
    大家看明白没有?
    一会儿用内嵌汇编写一个.
    等考试完了来吧.
    function Get1Digital(n:Integer):Integer ;
    asm
    //循环的次数
    mov ecx,32
    //保存1个个数
    xor edx,edx
    push ebx
    @@nLoop:
    //保存eax的值
    mov ebx,eax
    //让eax和1 进行与运算
    and eax,1
    //如果eax是0 就跳了
    jz @@nD
    //加1
    inc edx
    @@nD:
    mov eax,ebx
    //右移一位
    shr eax,1
    //循环次数减一
    dec ecx
    //循环
    jnz @@nLoop
    pop ebx
    //返回结果
    mov eax,edx
    end;
    //汇编还是很简单.好久没有写Delphi这方面的代码了.

    貌似没有考虑有符号整数.哈哈.罪过.

    好的,我是DH.

  • 相关阅读:
    Python学习笔记之操作yalm
    Python学习笔记之多线程
    Python学习笔记之网络编程
    Python学习笔记之面对象与错误处理
    Python学习笔记之装饰器
    Python学习笔记之内置模块
    Python学习笔记之函数与正则
    PAT甲级1049. Counting Ones
    PAT甲级1045. Favorite Color Stripe
    PAT甲级1034. Head of a Gang
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1619812.html
Copyright © 2011-2022 走看看