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

二进制操作最右侧位

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

   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/

标签: 算法
分享给朋友:

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

mysql服务无法启动 服务没有报告任何错误

mysql服务无法启动 服务没有报告任何错误

参考资料: http://bbs.csdn.net/topics/391851148 问题描述: 使用net start mysql启动MySQL服务时,提示:MySQL服务无法启动,服务没有报告任何错误。如下图所示: 可能原因: data目录里已经有数据里,所以有冲突。 解决办法: 1、删...

DSDT常见的Warning

DSDT常见的Warning

黑苹果要想搞的好,少不了DSDT。DSDT在编译的时候,最常见的Warning有以下几种 1、Use of complier reserved name 如图。这种Warning的解决办法是:将“_T_2”改成“T_2” 2、Not all con...

Keil单工程多Target的配置方法

Keil单工程多Target的配置方法

实现功能: 通过切换target实现不同的编译设置,而无需建立多个工程 需求背景: 调试一些算法,想使用STM32F107VCT6,但是发现STM32F107不能仿真,只有STM32F103可以仿真。 由于没有STM32F107VCT6实物,所以初期只能使用STM32F103仿真了。 STM32F1...

EEPROM读写注意事项

EEPROM读写注意事项

在实际使用EEPROM过程中,发现一些问题: 一、快速操作EEPROM造成读写数据出错 现象:读取的数据与写入的不同,但时序波形和硬件未发现任何问题。 在查阅EEPROM规格书后发现有一个很容易忽略的参数:TDHDL,此参数用于规定当对EEPROM进行一次I2C操作后必须再等待一段时间才能再对EEP...

K3老单插件控制字段显示

K3老单插件控制字段显示

https://www.cnblogs.com/youzhangcai1/p/10685778.html 【问题描述:】 我想在工业单据的插件中锁定单据头字段,但实现不了? 【解决方法:】 For i = 0 To m_BillTransfer.Head.count - 1 &n...

ios7与ios8 注册本地通知

// IOS8 新系统需要使用新的代码    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)     {     &...

发表评论

访客

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