当前位置:网站首页>奇技淫巧-位运算
奇技淫巧-位运算
2022-08-02 14:10:00 【老顽固也可爱】
位运算概览
| 符号 | 描述 | 运算规则 | 例子 |
|---|---|---|---|
| & | 与 | 两个位都为1时,结果才为1,否则结果为0 | 3&5=0011&0101=0001=1 |
![]() | 或 | 参加运算的两个对象只要有一个为1,其值为1。 | ![]() |
| ^ | 异或 | 两个位相同为0,相异为1 | 3^ 5=0011^0101=1001=9 |
| ~ | 取反 | 0变1,1变0 | |
| << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 | 1010 1110<<2=1011 1000 |
| >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
注意:负数按补码形式参加按位与运算。
1.与运算符(&)
| 与运算的用途 | |
|---|---|
| 取一个数的指定位 | 比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。 |
| 清零 | 如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 |
| 判断奇偶 | 只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a&1)==0)代替if (a%2 == 0)来判断a是不是偶数。 |
2.或运算符(|)
| 或运算的用途 | |
|---|---|
| 常用来对一个数据的某些位设置为1 | 比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X |
3.异或运算符(^)
异或的几条性质:
1、交换律
2、结合律 (a^ b)^ c == a^ (b^c)
3、对于任何数x,都有 xx=0,x0=x
4、自反性: a^ b^ b=a^0=a;
| 异或运算的用途 | |
|---|---|
| 翻转指定位 | 比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。 |
| 与0相异或值不变 | 例如:1010 1110 ^ 0000 0000 = 1010 1110 |
| 交换两个数 | 交换a与b的值,a ^= b;b ^= a; a ^= b; |
void Swap(int& a, int& b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
4.取反运算符 (~)
| 取反运算的用途 | |
|---|---|
| 使一个数的最低位为零 | 使a的最低位为0,可以表示为:a &~ 1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。 |
5.左移运算符(<<)
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
6.右移运算符(>>)
定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
注意
不同长度的数据进行位运算:如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
以“与运算”为例说明如下:我们知道在C语言中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行“与运算“,右端对齐后,左边不足的位依下面三种情况补足:
1)如果整型数据为正数,左边补16个0。
2)如果整型数据为负数,左边补16个1。
3)如果整形数据为无符号数,左边也补16个0。
边栏推荐
- pytorch模型转libtorch和onnx格式的通用代码
- Mysql connection error solution
- Failed to install using npx -p @storybook/cli sb init, build a dedicated storybook by hand
- 使用npx -p @storybook/cli sb init安装失败,手把手搭建专属的storybook
- 二叉树遍历之后序遍历(非递归、递归)入门详解
- win10系统更新错误代码0x80244022怎么办
- 【系统设计与实现】基于flink的分心驾驶预测与数据分析系统
- 基于矩阵计算的线性回归分析方程中系数的估计
- pygame绘制弧线
- FP7128内置MOS降压恒流调光深度0.01%高辉共阳调光方案
猜你喜欢
随机推荐
二叉树遍历之后序遍历(非递归、递归)入门详解
Win11没有本地用户和组怎么解决
Article pygame drag the implementation of the method
Cmd Markdown 公式指导手册
Publish module to NPM should be how to operate?Solutions to problems and mistake
Win10 Settings screen out from lack of sleep?Win10 set the method that never sleep
Yolov5 official code reading - prior to transmission
General code for pytorch model to libtorch and onnx format
5. Use RecyclerView to elegantly achieve waterfall effect
Open the door of power and electricity "Circuit" (2): Power Calculation and Judgment
模板系列-二分
casbin模型
flink+sklearn——使用jpmml实现flink上的机器学习模型部署
镜像法求解接地导体空腔电势分布问题
Win10 computer can't read U disk?Don't recognize U disk how to solve?
jest测试,组件测试
CI24R1小模块2.4G收发模块无线通信低成本兼容si24r1/XN297超低功耗
CMAKE
FP7126降压恒流65536级高辉无频闪调光共阳极舞台灯RGB驱动方案
Win10 cannot directly use photo viewer to open the picture










