彼得 的个人资料潘潘的永无乡照片日志列表更多 工具 帮助
9月23日

转载 【操作最右侧位】

review明帝童鞋的代码时偶发癫狂,研究起位操作...

硬件有太多的寄存器,定义无数的mask,如何最精简最高效并且保证可阅读性地进行寄存器中bit以及bit field的R/W?

 

来源:

http://blog.csdn.net/MichaelCode/archive/2008/11/06/3238983.aspx


 一、下面的公式将一个数的最右侧的'1'位变成'0'位,如果没有'1'位则生成所有位都为0的数:如 0010 1100 => 0010 1000

                             X & (X-1)                                           

       用这个公式可以判断一个数是否为2的幂(2n )如果X &  (X-1)==0,说明X为2的幂。同理,可以用X & (X+1)判断X是否为2n-1的形式。

 

二、下面的公式析出一个数最右侧的1位,如果没有1位,则生成所有位都为0的数,如:1011 1010 => 0000 0010

                             X & (-X)

三、下面的公式析出一个数最右侧的0位,如果没有0位,则生成所有位都为0的数,如:1011 1011 => 0000 0100

                            ~X & (X+1)

四、下面的三个公式可以识别后缀0的掩码,如果X=0则生成所有位都为1的数,如: 0101 1000 => 0000 0111

                           ~X & (X-1)       或      ~(X | -X)      或     (X & -X) -1

五、下面的公式可以识别最右侧的1位和后缀0的掩码,如果X=0则生成所有位都为1的数,如: 0101 1000 => 0000 1111

                            ~(X ^ (X-1))                   (可以用同或表示,因为没有同或符号,只能转化成等价的异或表达)

六、下面的公式可以向右传播最右侧的1位,如果X=0则生成所有位都为1的数,如: 0101 1000 => 0101 1111

                            X | (X-1)

七、下面的公式可以将最右侧连续的1位串改成连续的0位串,如:0100 1100 => 0100  0000

                         ( ( X | (X-1)) + 1) & X

         对于j>k大于0,这个公式可以用来检测一个非负整数是否具有2j-2k的形式,使用之后对结果作0-检测。

 

八、上面的公式都具有对偶性,交换描述中的0和1,在公式中用X+1替换X-1,用X-1替换X+1,用~(X+1)替换-X,用|替换&, 

         用&替换|,X和~X不变,则可以得到一个新的正确的描述和表达式。

 举个例子,第一个公式的对偶式为:

下面的公式将一个数的最右侧的0位变成1位,如果没有0位则生成所有位都为1的数,如:0100 1011 => 0100 1111

                 X | (X+1)

 

摘自:<<高效程序的奥秘>>

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/MichaelCode/archive/2008/11/06/3238983.aspx

评论 (7)

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

liuxianfei发表:
这个最好是用来查的...
9 月 25 日
黄洋发表:
Hacker's Delight是本好书,只是如果不追求极致效率,好像也不太有人推荐用里面的方法,毕竟可读性不强,要是一不小心写错了反倒弄巧成拙……
9 月 25 日
余勇发表:
拜一下
9 月 24 日
libobo发表:
将要笔试的ddmm快来看那~
9 月 24 日
马用功发表:
技术流
9 月 23 日
ZhuJiang发表:
hacker's delight到现在我也没看完,我一直怀疑那本书是数学书。。。
9 月 23 日
胡会结发表:
。。。拜技术贴。。。
9 月 23 日

引用通告

此日志的引用通告 URL 是:
http://peterpanpan.spaces.live.com/blog/cns!85DBE32663EC6D83!2576.trak
引用此项的网络日志