当前位置:网站首页>奇技淫巧-位运算
奇技淫巧-位运算
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。
边栏推荐
- Binder ServiceManager解析
- 编译error D8021 :无效的数值参数“/Wextra” cl command line error d8021 invalid numeric argument ‘/wextra‘
- Makefile容易犯错的语法
- Win10 computer can't read U disk?Don't recognize U disk how to solve?
- Win11系统找不到dll文件怎么修复
- In-depth understanding of Golang's Map
- Letter combination of LeetCode2 phone number
- General syntax and usage instructions of SQL (picture and text)
- source /build/envsetup.sh和lunch)
- LeetCode2 电话号码的字母组合
猜你喜欢
CI24R1小模块2.4G收发模块无线通信低成本兼容si24r1/XN297超低功耗
Mysql connection error solution
Summarize computer network super comprehensive test questions
How to set the win10 taskbar does not merge icons
cmake配置libtorch报错Failed to compute shorthash for libnvrtc.so
word方框怎么打勾?
win10任务栏不合并图标如何设置
Win11声卡驱动如何更新?Win11声卡驱动更新方法
2022TI杯D题混沌信号产生实验装置
Open the door to electricity "Circuit" (3): Talk about different resistance and conductance
随机推荐
Win10电脑不能读取U盘怎么办?不识别U盘怎么解决?
Open the door of power and electricity "Circuit" (2): Power Calculation and Judgment
Please make sure you have the correct access rights and the repository exists.问题解决
SQL的通用语法和使用说明(图文)
Win10 cannot directly use photo viewer to open the picture
DP1332E刷卡芯片支持NFC内置mcu智能楼宇/终端poss机/智能门锁
Redis的线程模型
General syntax and usage instructions of SQL (picture and text)
Mapreduce环境详细搭建和案例实现
Daily - Notes
轻量化AlphaPose
ASR6601牛羊定位器芯片GPS国内首颗支持LoRa的LPWAN SoC
LeetCode2 电话号码的字母组合
二叉树创建之层次法入门详解
FP5139电池与适配器供电DC-DC隔离升降压电路反激电路电荷泵电路原理图
KiCad常用快捷键
BLE蓝牙5.2-PHY6222系统级芯片(SoC)智能手表/手环
FP7195降压恒流PWM转模拟调光零压差大功率驱动方案原理图
镜像法求解接地导体空腔电势分布问题
CMAKE