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

二进制操作最右侧位

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

   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://www.xjtudll.cn/Exp/284/

标签: 算法
分享给朋友:

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

C#让TextBox滚动条一直位于最下部

TextChanged事件 滚动条自动处于TextBox最下部需要在Form1类中加上下段代码:   private void txtReceiveMsgChanged(object sender, EventArgs e) {     //...

REG51.H详解

/* BYTE Register */ sfr P0 = 0x80; //P0口 sfr P1 = 0x90; //P1口 sfr P2 = 0xA0; //P2口 sfr P3 = 0xB0; //P3口 sfr PSW = 0xD0; //程序状态字,具体位意义见位定义 sfr ACC = 0x...

android Service : onStartCommand intent为null

参考资料: http://hold-on.iteye.com/blog/2024926 问题: service中加入onStartCommand之后,不定期crash。 分析: 经查看onStartCommand中代码,只有intent为空才可能报NullPointException 。 inten...

找回丢失的“显示桌面”图标

Windows快速启动栏里面有个“显示桌面”的图标,点击图标就能快速切换到桌面,这个用起来很方便,当然用Windows+D快捷键也能实现该功能,不过对于我这种习惯用鼠标点击的人来说,还是“显示桌面”这个用起来爽。今天,一不小心,将“显示桌面...

phpstorm调试XDebug 超时问题

phpstorm+xdebug+apache 调试代码时,一分钟就超时处理: 修改配置文件:1.php.ini 设置xdebug, 增加 xdebug.remote_cookie_expire_time = 3600max_execution_time=3600max_input_time=3600...

ios ble:didDiscoverPeripheral没有回调

参考资料: http://stackoverflow.com/questions/26320578/diddiscoverperipheral-not-been-called-after-advertising-another-ios-device 问题: 启动scan之后,didDiscoverP...

发表评论

访客

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