博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【位运算总结】 之 与&
阅读量:4176 次
发布时间:2019-05-26

本文共 1242 字,大约阅读时间需要 4 分钟。


1、判断奇偶

       一个数二进制的末位数是1,则该数是奇数,末位数是0,则该数是偶数。因此可以用 a&1 == 0来判断。

       如下例:

#include 
using namespace std;int main(){ //输出0到100之间的所有奇数 for (int i = 0; i < 100; ++i) { if (i & 1) { cout << i << ' '; } } cout << endl; return 0;}

2、消除尾一

      Ⅰ、消除最后出现的1:x & (x - 1) 

       如:用 O(1) 时间检测整数 n 是否是 2 的幂次。

       因为2的幂次满足① > 0,②二进制表示中只有一个1。因此,代码如下:

#include 
using namespace std;int main(){ int n; cin >> n; if (n > 0 && (n & (n-1) == 0)) { cout << n << "是2的幂次" << endl; } else { cout << n << "不是2的幂次" << endl; } return 0;}

       再一个例子:计算在一个 32 位的整数的二进制表式中有多少个 1。

       x&(x-1)消去x的最后出现的1个1,因此不断做x = x&(x-1)就可以得到,x的二进制表达式中有多少个1。代码如下:

#include 
using namespace std;int main(){ int x; cin >> x; int cnt = 0; while (x != 0) { x = x & (x-1); cnt += 1; } cout << cnt << endl; return 0;}

       再如:如果要将整数A转换为B,需要改变多少个bit位?

        这是对上面问题的拓展,也会用到异或的知识。如果我们将A^B,相同位为0,相异位为1,接下来的就很容易想到了 —— 统计A^B后1的个数!代码如下~:

#include 
using namespace std;int main(){ int A, B; cin >> A >> B; int num = A + B; int cnt = 0; while (num != 0) { num = num & (num-1); cnt += 1; } cout << endl; return 0;}

       Ⅱ、消除最末所有位的1:x & (x + 1)

       如:(蓝桥杯2016省赛A5题):题目与题解见该链接

 

就先总结到这里啦~,之后遇到更有趣的继续总结!

转载地址:http://pvtai.baihongyu.com/

你可能感兴趣的文章
【EVB-335X-II试用体验】 上手试用与资源使用
查看>>
【EVB-335X-II试用体验】 Yocto环境的建立及Rootfs的构建与使用
查看>>
<<C++程序设计原理与实践>>粗读--chapter0 chapter1 chapter2
查看>>
<<C++程序设计原理与实践>>粗读--chapter3 chapter4 Chapter5
查看>>
<<C++程序设计原理与实践>>粗读 -- chapter8 Chapter9
查看>>
Linux Qt程序打包成一个可执行文件
查看>>
DragonBoard 410C中的Fastboot与调试串口注意事项
查看>>
跨系统的录音格式兼容性问题: iOS Android
查看>>
JVM 的垃圾回收器
查看>>
Mybatis的缓存
查看>>
@validated注解异常返回JSON值
查看>>
@JsonFormat注解使用
查看>>
Spring boot集成jxls实现导入功能
查看>>
Spring boot读取配置的方式(指定配置文件)
查看>>
Spring Boot切换不同环境配置
查看>>
Spring cloud之Ribbon搭建
查看>>
TreeMap 与 HashMap 的区别
查看>>
初识CAS
查看>>
Fork/Join 框架
查看>>
服务雪崩效应
查看>>