当前位置:网站首页>奇技淫巧-位运算
奇技淫巧-位运算
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。
边栏推荐
- Do Windows 10 computers need antivirus software installed?
- win10 system update error code 0x80244022 how to do
- Win10无法连接打印机怎么办?不能使用打印机的解决方法
- Article pygame drag the implementation of the method
- pygame draw arc
- [STM32 Learning 1] Basic knowledge and concepts are clear
- Win7怎么干净启动?如何只加载基本服务启动Win7系统
- yolov5官方代码解读——前向传播
- Yolov5 official code reading - prior to transmission
- 二叉树遍历之后序遍历(非递归、递归)入门详解
猜你喜欢
Open the door to electricity "Circuit" (3): Talk about different resistance and conductance
Makefile容易犯错的语法
MATLAB图形加标注的基本方法入门简介
ECP2459耐压60V降压BUCK电路用于WIFI模块供电方案原理图
STM32LL库使用——SPI通信
【STM32学习1】基础知识与概念明晰
Win10 cannot directly use photo viewer to open the picture
A clean start Windows 7?How to load only the basic service start Windows 7 system
利用plot_surface命令绘制复杂曲面入门详解
Summarize computer network super comprehensive test questions
随机推荐
用U盘怎么重装Win7系统?如何使用u盘重装系统win7?
MATLAB绘图函数plot详解
Fast advanced TypeScript
flink+sklearn——使用jpmml实现flink上的机器学习模型部署
FP7195大功率零压差全程无频闪调光DC-DC恒流芯片(兼容调光器:PWM调光,无极调光,0/1-10V调光)
Mysql的锁
ASR6601牛羊定位器芯片GPS国内首颗支持LoRa的LPWAN SoC
Bash shell位置参数
word方框怎么打勾?
使用libcurl将Opencv Mat的图像上传到文件服务器,基于post请求和ftp协议两种方法
KiCad Common Shortcuts
【STM32学习1】基础知识与概念明晰
Win11 system cannot find dll file how to fix
FP7195转模拟恒流调光芯片在机器视觉光源的应用优势
使用npx -p @storybook/cli sb init安装失败,手把手搭建专属的storybook
How to update Win11 sound card driver?Win11 sound card driver update method
Win11系统找不到dll文件怎么修复
Win7遇到错误无法正常开机进桌面怎么解决?
总结计算机网络超全面试题
2.4G无线小模块CI24R1超低成本