文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 397
阅读 6
收藏 0
点赞 0
评论 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
博文 2004
码字总数 14107
作品 0
深圳
程序员
预排序遍历树算法(modified preorder tree traversal algorith

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

mac_zhao
2015/06/25
0
0
Es6学习笔记(一)

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

小旭依然
2017/05/17
0
0
javascript--数组

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

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

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

KavenSu
2014/01/22
0
0
C++ STL学习——algorithm

在之前的博客中我们学习了很多STL中的模板库,包括deque,queue,stack,list等,他们都是一种数据结构,也就是说STL已经为我们实现了。今天我们来讲讲STL中比较大的一个库. 主要是一些算法的...

chenyufeng1991
2016/09/24
0
0
做程序员之后才知道的 5 件惊奇事-人际、协作很重要 编辑

本文由伯乐在线-吴鹏煜翻译自Henrik Warne。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 从我开始工作算起,已经有20多年了。即便如此,我依然记得当时对从大学毕业并开始工作的憧憬...

jiaorg
2014/05/08
0
0
delphi 中几种多线程操作方式

在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程。 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考...

moodlxs
2015/01/09
0
0
Delphi开发能力自我评测

Delphi开发能力自我评测日期:2008年11月23日 作者: 人气:3159 查看:[大字体 中字体 小字体](注:以下内容都是作者个人的学习经验和体会,仅代表个人观点。针对Win32下的Delphi程序开发而...

vga
2016/08/09
35
0
算法-数据结构

时间复杂度 O(log n) 意味着什么? 写给小白的时间复杂度指南 查找算法的 Java 实现 查找算法的 Java 实现 两个有序数组合并成一个有序数组 用拉链法和线性探测法解决哈希冲突 用拉链法和线性...

掘金官方
2017/12/14
0
0
使用C/Delphi编写ShellCode

来源:http://www.bootkitz.com/?p=93 文章谈的很好 这里说的ShellCode指的是一段x86机器码,无需重定位,在内存任何位置都可以执行的代码. 使用C/Delphi编写代码也是由其编译器特性决定的。...

BlAckEagle
2013/01/21
0
5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
9分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
18分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
24分钟前
0
0
maven配置文件settings.xml详解

settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径。 settings.xml文件是干什么的,为什么要配置它呢? 从settings.xml的文件名就可以...

浮躁的码农
29分钟前
0
0
MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]

MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]: 基础训练题: Q1:摇晃micro:bit编程板,随机出现7个小动物图标中的一个,并且前后相邻两次出现的小动物不重复。 注:七个小动物...

原创小博客
29分钟前
0
0
Redis 压力测试说明

Redis 压力测试说明 redis压力测试 2014-03-24 21:41:07| 分类: 默认分类 | 标签:redis |举报|字号 订阅 这几天对比测试mongodb、redis、pg的性能,主要是在消息队列、消息处理、用户经纬度...

舒文joven
29分钟前
0
0
拉姆达表达式 追加 条件判断 Expression>

public static class PredicateBuilder {   /// <summary>   /// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效   /// </summary...

Lytf
42分钟前
0
0
【HAVENT原创】Spring Boot + Kafka 消息日志开发

最近因为部门需要将服务程序的各种日志发送给 Kafka 进行分析,所以写一个 Kafka 消息日志操作类,主要用来保存日志到 Kafka 以便查询。 一、pom.xml 增加配置 <!-- HH: 引入 kafka 模块 ...

HAVENT
42分钟前
0
0
7、Git命令解析

1、创建版本库 cd E:mkdir myRepositorypwdls -ah======git init 2、添加文件到仓库 添加git add readme.txt提交git commit -m "i wrote a readme file"【为什么Git添加...

丑陋的皮囊
42分钟前
0
0
ImageMagick批量压缩图片

#!/bin/shfor img in `find ./image -name "*.jpg"`; donewimg=`basename $img` convert -quality 75% $img ./ok/$newimg echo ./ok/$newimgdone...

dworry
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部