文档章节

《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 只能用变通方法来复制数组。 扩展运算符提供了...

前端笔记
01/12
0
0
delphi之多线程编程(一)

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

KavenSu
2014/01/22
0
0
使用Delphi Packer来绕过恶意软件检测

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

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

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

小旭依然
2017/05/17
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

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 安装PHP5和PHP7

安装PHP5 下载解压二进制包 [root@test-a src]# cd /usr/local/src/[root@test-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[root@test-a src]# tar jxvf php-5.6......

野雪球
今天
4
0
windows上类似dnsmasq的软件Dual DHCP DNS Server

官网地址:http://dhcp-dns-server.sourceforge.net/官网定向的下载地址:https://sourceforge.net/projects/dhcp-dns-server/files/ 设置参考地址:http://blog.51cto.com/zhukeqiang/18264......

xueyuse0012
今天
3
0
LinkedHashMap源码解析

前言 HashMap中的元素时无序的,也就是说遍历HashMap的时候,顺序和放入的顺序是不一样的。 如果需要有序的Map,就可以采用LinkedHashMap. LinkedHashMap通过维护一个包含所有元素的双向链表,...

grace_233
今天
3
0
初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
5
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部