一、C++ 位运算
来源:互联网 发布:电脑软件 知乎 编辑:程序博客网 时间:2024/05/29 18:12
C++ 位运算
一、位运算符
1.1 与或非、异或
&:按位与(双目),两个操作数均为1时结果才为1
|:按位或(双目),只要有一个操作数为1结果就为1
^:按位异或(双目),两个操作数结果不同时结果为1,相同时结果为0
~:按位取反(单目),取反
1.2 左移、右移
<<:左移(双目),表达式:a << b的值是:将a各二进位全部左移b位后得到的值。左移时,高位丢弃,低位补0。 a 的值不因运算而改变。
>>:右移(双目),表达式:a >> b的值是:将a各二进位全部右移b位后得到的值。右移时,移出最右边的位就被丢弃。 a 的值不因运算而改变。
对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定, 如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移时高位就补充0。
二、按位与
通常用来将某变量中的某些位清0且同时保留其他位不变。也可以用来获取某变量中的某一位。
例如,如果需要将int型变量n的低8位全置成0,而其余位不变,则可以执行:
n = n & 0xffffff00;
也可以写成:
n &= 0xffffff00;
如果n是short类型的,则只需执行:
n &= 0xff00;
三、按位或
按位或运算通常用来将某变量中的某些位置1且保留其他位不变。
例如,如果需要将int型变量n的低8位全置成1,而其余位不变,则可以执行:
n |= 0xff;
0xff: 1111 1111
四、按位异或
按位异或运算通常用来将某变量中的某些位取反,且保留其他位不变。
例如,如果需要将int型变量n的低8位取反,而其余位不变,则可以执行:
n ^= 0xff;
0xff: 1111 1111
异或运算的特点是:如果 a^b=c,那么就有 c^b = a以及c^a=b。 (穷举法可证)
另外,异或运算还能实现不通过临时变量,就能交换两个变量的值:
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
即实现a,b值交换。穷举法可证。
五、左移、右移
左移n位相当于乘以2^n;右移n位相当于除以2^n,结果往小取整(比如右移后结果为-1.0213,取整后为-2)
六、小结
按位与
1. 用于清0(&0)
2. 保留某些位不变(&1)
3. 获取某位(该位&1,其他&0)
按位或
1. 置1(|1)
2. 保留某些位不变(|0)
按位异或
1. 取反(^1)
2. 保留某些位不变(^0)
3. 实现a、b交换(a^=b; b^=a; a^=b)
左移
1. 左移n位相当于乘以2^n
右移
1. 右移n位相当于除以2^n
2. 结果往小取整
- 位运算符(一):C/C++位运算符
- 位运算符(一):C/C++位运算符
- C语言基础一(位运算)
- 位运算符介绍(一):C/C++位运算符
- 位运算符介绍(一):C/C++位运算符
- 位运算艺术(一)
- 位运算艺术(一)
- 位运算艺术(一)
- 位运算(一)
- 一、C++ 位运算
- c基础【一】利用位运算实现数字反转
- c语言中的位运算与进制(一)
- C-枚举,位运算
- C语言位运算
- C语言位运算
- 【C++】位运算符
- C语言位运算
- c语言位运算
- [bzoj4570][scoi2016]妖怪 二分区间
- 关于Threadlocal
- 如何在集合中筛选出满足条件的元素——org.apache.commons.collections4的使用
- VMware 设置开机自启动
- Retrofit + RxJava 业务状态重定向及分离
- 一、C++ 位运算
- 一个ForkJoin并行任务的实际应用
- 5.30 convexhull.cpp 学习
- 获取spring容器要小心的坑
- 第8章:线性时间排序
- iOS 多线程篇10—NSOperation基本操作
- use prebuild static lib on another android project
- 修改eclipse中的svn用户名和密码
- 深入理解JVM—JVM内存模型