文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 397
阅读 9
收藏 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;

 
 
 
 
 

 

 

  
涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
【opencv】图形的绘制

1.矩形图像的绘制: 原函数:void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8,int shift=0) img就是需要绘制的图像 pt1 and pt......

其实我是兔子
2014/10/08
1.2K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.3K
8

没有更多内容

加载失败,请刷新页面

加载更多

画国旗,为祖国庆生!告诉你所不知道的关于国旗的那些事

1.关于国旗尺寸与标准的规定 五星红旗的形状为长方形,红色象征革命,其长与高之比为3:2,旗面左上方缀黄色五角星五颗,象征共产党领导下的革命大团结,星用黄色象征红色大地上呈现光明。一星...

pythonexpert
2019/09/30
0
0
再见,ELK!

点击上方蓝色字体,选择“标星公众号” 优质文章,第一时间送达 99套Java企业级实战项目 4000G架构师资料 作者:linkt1234 blog.csdn.net/Linkthaha/article/details/100575278 最近,在对公...

老炮说Java
07/04
0
0
区域经济评论:国际区块链产业发展概况分析

从全球范围看,在产业规模层面,全球在经历了2014年和2017年的区块链企业成立数量高峰期后,自2018年起,截至2019年8月,全球共有2450家区块链企业。美国、中国、英国区块链企业数量分别位列...

osc_4dgu16li
6分钟前
0
0
硬件:那些安装8G、16G以及32G内存电脑的区别介绍

现如今的电脑都是8G内存起步的,不管是台式电脑还是笔记本电脑都一样。而因为内存条价格不贵的关系,大家都在考虑是否将8G内存升级为16G内存,甚至32G内存。但是这真的有必要吗?8G、16G以及...

osc_m8miia9c
8分钟前
0
0
每天分享一些好句子,赏个心情~😁

本文分享自微信公众号 - 程序员的时光(gh_9211ec727426)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

程序员的时光
04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部