位操作网上有很多介绍,请上网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.位操作的更多相关文章

  1. DELPHI判断是否64位操作系统

    function IsWin64: Boolean;var  Kernel32Handle: THandle;  IsWow64Process: function(Handle: Windows.TH ...

  2. 转:Delphi 6 实用函数

    来自: daocaoren0824, 时间: -- ::, ID: 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大 ...

  3. 【Delphi内联汇编学习1】Delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  4. delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  5. Windows API方式直接调用C#的DLL,支持多音字转拼音、Gzip解压缩、公式计算(VBA、C++、VB、Delphi甚至java都可以)

    原始链接 https://www.cnblogs.com/Charltsing/p/DllExport.html 这两年,我在VBA应用方面一直有几大痛点:1.多音字转拼音:2.64位下的GZIP解压 ...

  6. C#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )

    前因后果 调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错. 函数声明: 一.读卡函数    ************************ Delphi 调用 ****** ...

  7. 学习笔记:7z在delphi的应用

    最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...

  8. delphi连接sql存储过程

    针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...

  9. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

随机推荐

  1. Query 一些简单的效果

    Query 一些简单的效果 $(selector).hide(speed,callback); 隐藏 $(selector).show(speed,callback); 显示 $(selector). ...

  2. Convert.ToInt32()与int.Parse()的区别

    Convert.ToInt32()与int.Parse()的区别 (1)这两个方法的最大不同是它们对null值的处理方法:    Convert.ToInt32(null)会返回0而不会产生任何异常, ...

  3. C的文件操作

    文件文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等 ...

  4. java程序员烂大街为何还不便宜?

    最近跟一朋友聊天,他是做c#开发的.他答应了老板带领一帮java工程师开发网站.披星戴月终于搞定,现在已经盈利.但是他公司的那帮搞c#的同事不淡定了. 在招聘java程序员的时候2年有开15k的.5年 ...

  5. VMvare克隆复制多个操作系统

    目的:完成linux的双机和集群实验 2016-12-06 在网上查找了一些资料现整理如下,以供之后查看和帮助他人. 注意事项: 1.关闭源虚拟机的电源: 操作很简单 选择完整创建 输入源克隆机的用户 ...

  6. 给linux 授权一个可以远程登录的账户

    创建用户:grant all on *.* to '; 授权:flush privileges;

  7. texturepacker打包图片,场景切换时背景图有黑边

    在使用TexturePacker打包图片之后,背景图在场景切换(有切换动画)时,明显能看到有黑边,在百度之后解决了. 知乎上边有网友贴出了两种解决方法,我抄过来如下: 第一种: 修改 ccConfig ...

  8. MIT JOS学习笔记02:kernel 01(2016.10.28)

    未经许可谢绝以任何形式对本文内容进行转载! 在文章开头不得不说的是,因为这部分的代码需要仔细理清的东西太多,所以导致这篇分析显得很啰嗦,还请谅解. 我们在上一篇文章已经分析了Boot Loader的功 ...

  9. java POI 解析excel 2003和2007 直接转为List<Map> 返回

    1.POI 官网下载jar包,3.5以上 2.项目导入jar包 3.参数:String数组--对应的excel列名对应的KEY,File  excel文件,sheetNumber ---excel的s ...

  10. 【以前弄的老东西】DLLspy超犀利后门 (源代码+程序+使用手册+二次开发文档)

    这个玩意儿是很久之前的整的.一直没有做完,但是基本功能和框架都做好了,现在发出来,希望有能力的家伙一起完成.DLLspy,绝对免杀,隐藏,HTTP请求劫持,居家旅行,杀人放火必备良药.有时间我会继续开 ...