c_c++刁钻问题各个击破之位运算及其实例(2)

位运算及其应用实例(2)

摘要

上一篇《C/C++刁钻问题各个击破之位运算及其应用实例(1)》受到不少网友的关注,这对我鼓励极大,首先感谢这些网友,特别要感谢几位回复的热心网友。

上一篇中我对位运算进行了简单介绍,并谈到了如何操作整数的位,比如将某位置0、置1、翻转、查询某位是否为1等,最后在这些基本的位操作上给出了3个位运算的应用实例。本篇是上一篇的续集,我将给出6个比较复杂一点的位操作,并对比较难以理解的位操作进行图文并茂的剖析,由于不想在一篇当中写太多内容,因此本篇中的这些位操作的实际应用案例我将在以后给出,即便是这样,本篇仍然非常重要,它是我们应用位运算来解决问题的基础

上一篇中的四个基本位操作

1.        将expr的第n(n从0开始)位设置为1:  expr |= (1<<n);

2.        将expr的第n(n从0开始)位设置为0:    expr &= (~(1<<n));

3.        判断expr的第n(n从0开始)位是否为1:bool b = expr &(1<<n);

4.        翻转expr的第n(n从0开始)位:expr ^= (1<<n);

本篇的8个较复杂的位操作

下面介绍本篇的重点:8个较复杂的位操作。要理解这些位操作并不容易,我将使用文字+图解的方式来描述,力求讲明白,需要说明的是,为了作图方便,我假设数据都是char类型(只有8个bit),这些位操作对其他类型的数据同样适用。

1.       将最右侧的1翻转成0:x&(x-1)

假设x=01110100,那么x,x-1和x&(x-1)的二进制表示分别如下:

x:

0

1

1

1

0

1

0

0

x-1:

0

1

1

1

0

0

1

1

X&(x-1):

0

1

1

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值