delphi.位操作
位操作网上有很多介绍,请上网google/baidu,比如:
http://blog.csdn.net/g_spider/article/details/5750665
http://blog.csdn.net/morewindows/article/details/7354571
。。。
位操作C/C++或Delphi/pascal,其实都类似,只不过语言表达方式不同而已。
位操作 c/c++ delphi/pascal
与 & and
或 | or
非 ! not
异或 ^ xor
左移 << shl
右移 >> shr
要注意的是:D里面的位操作(与或非)与逻辑操作的关键字是相同的,所以平时没注意的话,可能就搞错了。
下面,介绍一下俺平时的位操作,其它的技巧,请自行查资料:
一:标志位:and or not
置标志位有值: v := v or flag;
置标志位无值: v := v and not flag;
检查是否有标志位有值:if (v and flag) = flag then 有值 else 无值.
其中:
1: v = Integer/Int64,即一个32或64位的数字(非浮点型)
2: flag 必须是2的N次方,(请用16进制8421助记),即:
$1, $2, $4, $8,
$10, $20, $40, $80
$100, $200, $400, $800
...
$10000000, $20000000, $40000000, $80000000
都是类似16进制,且,如果有"N个位"进行置位值,则flag = $1 or $2,这样类似表示。
然后,看到这些,如果经常看Windows.pas的常量定义,就会发现,很多常量,就是这样定义的。
为的就是,这个标志位进行取值,赋值,检查值。
具体为啥这样定义,请自行用计算器(二进制模式),进行and or not操作,慢慢摸:D
3: if (v and flag) = flag then 有值 else 无值.
一般这种写法,我会省略为:
if (v and flag) <> 0 then 某值的标志位有值;
if (v and flag) = 0 then 某值的标志位无值;
然后,可以写成多标志位:
const Masks = flag1 or flag2 or flag3....;
置多标志:x := v or Masks;
取值多标志:x := v and not Masks;
检查多标志:if x and Masks <> 0 then ...
二:字节对齐:
字节对齐---对一个值,进行:不足则补足。如:
给出一个数:X,要对它进行对4补齐,则:
1:x = 5时,需要得到align(x) = 8,就是说8是x对4的补齐后的数字。
2:x = 16时,已经补齐,则align(x) = 16,即保持原值。
请注意:对齐数,必定为2的N次方。
上面的逻辑,写成代码就是:
x := 5;
a := 4;
x := (x + (a - 1)) and not (a - 1);
这样,经过上述一行,and not 操作,x就与a对齐了。
我一般这样简写:
x := (x + a - 1) and -a;
三:乘除法
用位移可以有限的代替乘除,因为只针对于被乘除数是2的N次方,如:
x * 2 ==> x shl 1
x * 4 ==> x shl 2
x div 8 ==> x shr 3
x div 16 ==> x shr 4
请看被乘除数:2,4, 8, 16,相当于2的1,2,3,4次方.
四:掩码相关
取一个字节中的前4位:v := v and $0F;
取一个字节中的后4位:v := v shr $04;
那前3位,就是将前三位(以二进制数看)作掩码,然后进行and:flag = $01 or $02 or $04; v := v and flag;
后3位,就自己想了。
五:根据三+四的法子,可以很方便的,使用and进行求模操作
求模操作在使用hash取索引值是:mod: index := abs(key mod len);
也可以这样:
1:len = 2的N次方。
2:index := key and (len - 1);
得到某数的余数:x := a mod b;
如果b是2的N次方,则可以:x := a and (b - 1);
六:一些小技巧:
1: 检查某值是否为2的N次方:if (v and (v - 1)) = 0 then writeln('v是2的N次方');
2: 检测某值是否偶数:if (v and 1) = 0 then writeln('v是偶数'); // 等同于:if v mod 2 = 0
3: 想到再加吧,有些也不常用,或者请到上面链接查看一些更详细的技巧。
水平有限,如有雷同,就是盗链,:D
2014.11.02 by qsl
delphi.位操作的更多相关文章
- DELPHI判断是否64位操作系统
function IsWin64: Boolean;var Kernel32Handle: THandle; IsWow64Process: function(Handle: Windows.TH ...
- 转:Delphi 6 实用函数
来自: daocaoren0824, 时间: -- ::, ID: 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大 ...
- 【Delphi内联汇编学习1】Delphi与汇编
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...
- delphi与汇编
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...
- Windows API方式直接调用C#的DLL,支持多音字转拼音、Gzip解压缩、公式计算(VBA、C++、VB、Delphi甚至java都可以)
原始链接 https://www.cnblogs.com/Charltsing/p/DllExport.html 这两年,我在VBA应用方面一直有几大痛点:1.多音字转拼音:2.64位下的GZIP解压 ...
- C#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )
前因后果 调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错. 函数声明: 一.读卡函数 ************************ Delphi 调用 ****** ...
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- delphi连接sql存储过程
针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...
- delphi 2010与delphi XE破解版的冲突
在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...
随机推荐
- SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)之间区别
http://m.blog.csdn.net/article/details?id=52795914#0-qzone-1-52202-d020d2d2a4e8d1a374a433f596ad1440
- 【转载】javascript与C#的语法区别
由于博主不允许的情况下不允许转载,我在这里只放上链接 http://blog.csdn.net/ranlianjie/article/details/2484139
- Python 定位字符串
一位朋友在玩闯关游戏时遇到如下问题: 感觉考查的就是字符串操作,用string模块就可完成:代码如下: # -*- coding: utf-8 -*- __author__ = 'Evilxr' im ...
- js中遍历对象的属性和值
今天想看一下js的数组遍历的内容,搜索到了一个关于对象遍历写好的函数,保留一下.以后好用. function allPrpos ( obj ) { // 用来保存所有的属性名称和值 var p ...
- 从txt文件中读取数据放在二维数组中
1.我D盘中的test.txt文件内的内容是这样的,也是随机产生的二维数组 /test.txt/ 5.440000 3.4500006.610000 6.0400008.900000 3.030000 ...
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- MongoDB学习笔记六:进阶指南
[数据库命令]『命令的工作原理』MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询,因此,> db. ...
- OpenGL渲染管线
OpenGL渲染管线具有一系列顺序处理阶段.两个图形信息数据,顶点数据与像素数据,在管线中被处理.组合,最终写入帧缓存.注意,OpenGL可以将处理过的数据送回到你的程序中.(参考灰色区域) Open ...
- linux 下如何抓取HTTP流量包(httpry)
基于某些原因你需要嗅探HTTP Web流量(即HTTP请求和响应).例如,你可能会测试Web服务器的性能,或者x奥uy调试Web应用程序或RESTful服务 ,又或者试图解决PAC(代理自动配置)问题 ...
- C#-2 wpf 项目编程结构设计
View:界面布局 EXCEL ViewModel:流程,数据粘合胶水 Model: 1)DB 结构 (数据库结构) 2)绑定的数据(界面交互数据) Service:1)BLL(画流程图)画业务逻辑图 ...