当前位置:首页 > 技术心得 > 正文内容

二进制操作最右侧位

xjtudll13年前 (2013-09-25)技术心得9180

   1  将最右侧的1变成0(可利用判断是不是2的幂) 

下面这个公式可以将一个数x的最右侧1变成0,如果没有1,则生成的所有位都是0

x &x-1

例如:0101 1000 B -----> 0101 0000 B

这个公式还可以用来检测该数是不是2的幂,如果一个数是2的幂,那么必然满足:

x &x-1 = 0

比较常见的应用就是:判断是否只有有个按键按下。

同样的道理,也可以用类似的办法来判断一个数是不是2n-1

x&x+1 = 0

  2 传播最右侧位 

利用以下公式可以传播最右侧的1,如果为 0,则生成的是1

x | (x-1)

例如:0101 1000 B -----> 0101 1111 B 

  将最右侧0变成1 

利用以下公式可以将最右侧0变成1,如果没有0,则生成的所有位都是1

x | (x+1)

例如:1010 0111 B -----> 1010 1111 B

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/284/

标签: 算法
分享给朋友:

“二进制操作最右侧位” 的相关文章

蓝牙4.0手表功能简析

蓝牙4.0手表功能简析

蓝牙手表可以分为两大类:(1)蓝牙为手表的主要功能,脱离了蓝牙,手表将只有时间相关功能。这类手表主要是作为配件使用;(2)手表本身具有强大的功能,蓝牙只是锦上添花。例如Pebble,I’m Watch,SonySmart Watch等等。此次分析的是第一类产品——...

vs2010删除臃肿的ipch和sdf文件

vs2010删除臃肿的ipch和sdf文件

VS2010建立C++解决方案时,会生成一个sdf文件和ipch文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大,一个简单的程序都会占用几十M的硬盘容量。 解决方法: Tools->Options->Text Editor->C/C++->Advanced(高...

Altium连续选择多个元件

Altium连续选择多个元件

以前在Protel99SE中,选中一个元件后,只要不取消选择(deselect),还可以接着选择元件,一直到足够为止。而Altium默认设置中,选择元件后,若你单击了PCB其他区域,之前的选择将失效,只能通过 Shift+鼠标单击来完成多个元件的选择。这种做法使得从Protel99SE转过来的用户极...

Quartus Error: Signal "XX" drives an input pin”

问题: Quartus II编译提示:“Error: Signal "B" drives an input pin” 原因: 不该相连的节点(或PIN)连接到了一起了,有可能是被自动连接上了,删除不需要的连接即可。 还有种情况是:导线的名称跟Input...

Word删除空格、空行、超链接宏

1、删除空格和空行 此宏的主要功能是删除空格,并将软回车替换为硬回车 Sub 删除空格和空行() ' ' 删除空格和空行 宏 ' '    '英文单词与英文单词之间保留一个半角空格,其他的所有空格均删除     myReplaceExecute Se...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。