zoukankan      html  css  js  c++  java
  • Delphi 的 Bit

    我一直感觉 Delphi 下的Bit操作不是很好使,

    所以一直屏蔽着这方面的学习。不过最近收集整理了一下代码。

    原因是这样的。

    由于某个需求被分解成 在 0~n(不定) 中,有几个数字被置换成了“true”

    由于我自己写了一个类来管理某个Record,而这个Record是用Variant来作为参数。(类似TDataSet)。

    开始的时候,我想着吧,用 array of Boolean,可惜Variant 中怎么

    v:=VarCreateVariant([0,n],varBoolean)

    不会操作 v[10]:=true 这种事情。

    于是干脆变成了 array of Byte

    声明了8个array of Byte(注意这个数字,很巧的是,需求上的数字竟然是8)

    开始的时候我没有太在意,而我一个尚在实习期的的同事说起,这8个array不就是一个array of Byte吗?

    (呵呵,现在的学生都很强啊!!!)

    没错,我声明了8组 array of Byte,而事实上,真正使用的永远是0,1两个数字。

    所以,我的计划改变,需要1组 array of Byte,而由1个Byte,来同时控制8组内容。

    尽管,n是在动态中被分配的,8组内容的长度原本就不同,现在,我只要留下最长的那组,其他7组舍弃,

    岂不是即节约了内容,又节约了时间?!?!?!?

    废话就这么多。

    且看我整理的关于Bit的内容。

    // 得到是1的个数
    Function Count1Bit(ANum:Integer):Integer;
    asm
      xor edx,edx // 位数
      xor ecx,ecx // 1的个数
      @@nLoop:
      cmp edx,32  // 循环32次
      je @@nExit
      bt eax,edx
      jnc @@nNoInc // if CF = 0 then
      inc ecx
      @@nNoInc:
      inc edx
      jmp @@nLoop
      @@nExit:
      mov eax,ecx
    end;

    type
      TBit   = 0..1;
      TBitID = 1..8;
    // 位读
    function GetBit(AValue:Byte;AIndex:TBitID):TBit;
    const Bool_Bit:array[False..True] of TBit = (0,1);
    begin
      Result:=Bool_Bit[AValue and (1 shl (AIndex-1))<>0];
    end;  
    // 位写
    procedure SetBit(var AValue:Byte;AIndex:TBitID;ABit:TBit);
    begin
      if ABit=0 then
        AValue:=AValue and not (1 shl (AIndex-1))
      else
        AValue:=AValue or (1 shl (AIndex-1));
    end;
    // 位取反
    procedure NotBit(var AValue:Byte;AIndex:TBitID);
    begin
      AValue:=AValue xor (1 shl (AIndex-1));
    end; 

     

    很简单O(∩_∩)O~  可惜我没太在意理解其中的变化过程,时间有限,能用即可。

    同时,我稍微看了一下 TBits

    也很好使。

    如果 大于 8位以上的 “bit”,就没有办法用我之前的那些函数。

    好彩,TBits 也可以。

      bb:=TBits.Create;
      bb.Size:=8;
      bb[0]:=true;
      bb[7]:=true;

    也很简单。

    缺陷是,没办法直接得到一个 Integer (由Size个Bit组成的Integer,毕竟这只是一个管理每个位置是F,还是T的类而已)

    顺便,唯一一个函数 OpenBit ,其实是指第一个为false的位置是哪里,例子中返回“1”。

     

    那3个函数,我够用了。留在这里,周一复制到公司用。

  • 相关阅读:
    UDP:用户数据报协议(User Datagram Protocol)
    线程池的使用
    SQL Server表和模式空间使用情况http://www.51myit.com/thread2466911.html
    bytetobmp and bmptobyte(Image)
    c# TCP例子转载
    POJ 4047Garden
    NYOJ 102 次方求模
    Sum
    POJ 1094 Sorting It All Out(经典拓扑,唯一排序)
    POJ 2387 Til the Cows Come Home(Dijkstra)
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380475.html
Copyright © 2011-2022 走看看