位运算
位运算
1.位运算概览
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 都为1结果为1 |
| | 或 | 都为零结果为0 |
~ | 非 | 零一取反 |
^ | 异或 | 不同为1,相同为0 |
<< | 左移 | 各二进制位全部左移若干位,高位丢弃,低位补零 |
>> | 右移 | 各二进制位全部右移若干位,对无符号数,高位补0;对有符号数,不同编译器处理的方法不同,有的是高位补符号位(算术右移);有的是高位补0(逻辑右移) |
2.按位与运算符(&)
定义:参加运算的两个数据,按二进制位进行与运算,运算规律如下:
0&0=0 0&1=0 1&0=0 1&1=1
注意:负数按补码的形式参与运算
与运算的用途
- 清零
如果想将一个数的二进制位置零,将对应二进制位与0进行按位与运算 - 取一个数的指定位
比如,想要取X = 0010 1100的低四位,则将其和数0000 1111进行按位与运算。 - 判断奇偶
可以根据二进制数的最后一位是0还是1来判断,对于正数来说补码与原码相同,如果最后一位是0,则为偶数,如果最后一位是1,则为奇数;对于负数来说,先求其原码,即将补码按位取反再加一,不难发现补码和原码的二进制末位一定相同,故末位若为1,则为奇数,若末位为0,则为偶数
故下面的两个条件判断语句都可以实现奇偶数的判断:// == !=运算符的优先级高于&
if((a & 1) == 0)
if(a % 2 == 0)
3.按位或运算(|)
定义:有1则为1,全0则为0
或运算的用途
常用来给二进制数的某一位置1
4.异或运算(^)
定义:参与运算的二进制数按位异或,运算规则如下:
0^0=0 0^1=1 1^0=1 1^1=0
异或的常用性质
- x^x=0 x^0=x x^1=~x(~是取反)
- 自反性:a^b^b=a^0=0
异或运算用途
- 翻转指定位:
将对应位与1异或,即可翻转指定二进制位 - 啥也不干
将其与0异或即可 - 交换两个数的取值
void Swap(int a* int b*)
{
if(a != b)
{
a^=b;
b^=a;
a^=b;
}
}
5.取反运算符(~)
取反运算符的用途
- 将数的最末位置0
a & ~1
6.左移(<<)右移(>>)运算符
每左移一位,相当于该数乘2,每右移一位,相当于操作数除2
7.不同长度运算符进行位运算的说明
不同长度的数据进行位运算时,系统会首先将两个数按右端对其,然后进行位运算。
左边不足的位依照以下三种情况补足:
- 数据为正数,左边补0
- 数据为负数,左边补1
- 数据为无符号数,左边也补0
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鼠鼠的藏宝洞!