文档章节

《Delphi 算法与数据结构》学习与感悟[3]: 获取一个字节中非空位的个数

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 397
阅读 6
收藏 0
一个字节有 8 个位, 这些位可能是 0 也可能是 1; 现在要算出一个字节中是 1 的位共有多少个.

第一种方法是一个函数;
第二种方法笨了点, 是先把 256 种可能值给一个数组, 随时调取.

第一种方法虽然灵巧, 但不如第二种方法快(作者书中说: 在非特殊情况下, 一般要快到 10 倍左右);
第二种方法虽然快捷, 并且使用方便, 但要以 256 个字节的数组空间为代价.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{方法1: 获取函数}
function GetByteBits(x: Byte): Byte;
begin
  Result := 0;
  while x <> 0 do
  begin
    if Odd(x) then Inc(Result);
    x := x shr 1;
  end;
end;

{方法2: 把所有可能的值放在一个常数数组}
const
  BitArr: array[0..MAXBYTE] of Byte = (
    0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8);

{测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  b,num: Byte;
begin
  b := 255;
  num := GetByteBits(b);      {使用函数获取}
  ShowMessage(IntToStr(num)); {8}
  num := BitArr[b];           {直接使用数组获取}
  ShowMessage(IntToStr(num)); {8}

  b := 254;
  num := GetByteBits(b);      {使用函数获取}
  ShowMessage(IntToStr(num)); {7}
  num := BitArr[b];           {直接使用数组获取}
  ShowMessage(IntToStr(num)); {7}
end;

end.

 
 
 
 
 

 

 

  
那个小函数, 琢磨了半天才明白(惭愧); 以后判断其他数也没问题了, 譬如判断 Integer:
function GetIntBits(x: Integer): Byte;
begin
  Result := 0;
  while x <> 0 do
  begin
    if Odd(x) then Inc(Result);
    x := x shr 1;
  end;
end;

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/03/17/1110632.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
javascript--数组

摘自ES6入门--阮一峰 扩展运算符(spread)是三个点()。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。 (1)复制数组 ES5 只能用变通方法来复制数组。 扩展运算符提供了...

前端笔记
2018/01/12
0
0
预排序遍历树算法(modified preorder tree traversal algorith

这个算法有如下几个数据结构: 1、lft 代表左 left 2、rgt 代表右 right 3、lvl 代表所在的层次 level 下面这个图是一个典型的结构: 我们先看一些使用方法 1、查看整个树(A)有多少节点(包含自...

mac_zhao
2015/06/25
0
0
使用Delphi Packer来绕过恶意软件检测

     打包和加密恶意程序是攻击者常用的绕过静态和动态分析的方法。恶意软件的分类和检测的绕过其实是一场攻击者和防御者之间的军备竞赛,因为不断有新的技术被交易和应用。比如,地下市...

嘶吼RoarTalk
2018/10/21
0
0
Es6学习笔记(一)

1、关于let -- let变量必须先声明,后使用 -- 在同一作用域,let不能重复声明 -- let增加了块级作用域,从而从某种意义上取消了自我执行函数 2、关于const -- const只声明一个常量,一旦声明...

小旭依然
2017/05/17
0
0
delphi之多线程编程(一)

delphi之多线程编程(一) 本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。 多线程应该是编程工作者的基础...

KavenSu
2014/01/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 命令

#查看系统版本cat /etc/issuecat /etc/redhat-release#yum源库路径/etc/yum.repos.d#更新源yum makecache#解包:tar zxvf FileName.tar#打包:tar czvf FileName...

MrPei
10分钟前
2
0
ZStack——自动化测试系统1:集成测试

测试,对于一个IaaS软件的可靠性、成熟度和可维护性而言,是一个重要的因素.测试在ZStack中是全自动的。这个自动化测试系统包括了三个部分:集成测试,系统测试,基于模块的测试。其中集成测...

ZStack社区版
15分钟前
1
0
springboot 中注入service为空

注意:在Controller中的方法必须用public 参考:spring boot 中使用@Autowired注入服务 服务为空没有注入成功

Skqing
26分钟前
3
0
PyCharm入门教程——IDE概要

PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web...

电池盒
30分钟前
1
0
JVM 知识

一、类加载机制 二、对象的创建的过程 三、JVM内存结构 四、JVM GC 从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:再细致一点有:...

梦想_与_现实
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部