• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

delphi.位操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

位操作网上有很多介绍,请上网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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphi跨版本DLL调用嵌入窗体实现发布时间:2022-07-18
下一篇:
DelphiPost登陆Delphi盒子论坛源码发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap