在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
位操作网上有很多介绍,请上网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 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论