位运算
2022/7/9 23:24:03
本文主要是介绍位运算,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
按位与
and 或者 & (前者为Pascal,后者位C++,下同)
定义:两者都为1时,结果为1,否则为0。
例:1001 & 1111 = 1001
1101 & 0001 = 0001
用处:
and运算通常用于二进制的取位操作。
- 判断奇偶
例如一个数 and 1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数
-
对一个16位数高8位清零,低8位保留。
int x=6550; x=x&255; printf("%d ",x); //6550 = 1 1001 1001 0110 //255 = 1111 1111 //高8位补0,低8位与1并后不变,实现清0。 //x = 150
-
从右边开始,把最后一个1改写成0
x & (x-1)
按位或
or 或者 |
定义:两者都为0时,结果为0,否则为1。
例:1001 | 1111 = 1111
1101 | 0001 = 1101
用处:
or运算通常用于二进制特定位上的无条件赋值。
- 例如一个数or 1的结果就是把二进制最末位强行变成1。
如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了。
其实际意义就是把这个数强行变成最接近的偶数。(2变成2,3变成2,避免奇偶判断)
n = (n|1) - 1;
按位异或
xor 或者 ^
**定义:两者相同时为1,不同为0。 **
例:1001 ^ 1111 = 1001
1101 ^ 0001 = 0011
用处
- 不用临时变量交换两个变量:
void swap(int &x,int &y)//记得传址 {x = x^y; y = y^x; x = x^y;}
解释:异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。
所以上面,就是$ y = y | (x | y) = x | y | y = x$,
这个时候,\(x=x|y\)就变成了第三变量,
再让 \(x|y\) (这时 \(y\) 是 \(x\) 的值)就回到 \(y\) 。
- 同理,也可以用这个来加密:
设定一个密钥,做异或运算加密,再做异或运算解密。
按位取反
not 或者 ~
定义:按位取反
~0 = 1
用处:
-
逻辑判断
-
如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差。
左移
shl 或者 <<
定义:向左移动x位,数值大小变为原来的 \(2x\) 倍。
例:1111 << 10(2) = 111100
右移
shr 或者 >>
定义:向右移动x位,数值大小变为原来的 \(1/2x\) 倍。
(所以它可以用来多次除2。比如:二分查找,来提高程序效率。)
注:向下取整
例: 1111 >> 10(2) = 11
-
取出一个16位数的高8位。
int x=6550; x=x&(65535-255); x=x>>8; printf("%d ",x);
总注
- C++中的 $ and$ 与 \(or\) 替代的是 && 与 || ,并非位运算符
- 运算优先级:(<<、>>)、(*、/)、(+、-)、~、&、^、|
这篇关于位运算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南