一、简介

特性:方便且高效 注意:结果不能直接输出,要赋值给一个变量才行
  1. 位逻辑运算符
1
2
3
4
5
& (“与”)
^(“异或”)
|(“或”)
~(“取反”)
//结合性为从左到右,优先级高于逻辑运算符,低于比较运算符(正因为如此所以你再写什么n&1等于0一定要把n&1加括号!!!),从高到低依次为&、^、|
  1. 移位运算符
    1
    2
    <<(左移)
    >>(右移)

二、位逻辑运算

1.&运算:两个数二进制对应位都为1那一位才为1
1
2
3
4
0&1=0;
0&0=0;
1&0=0;
1&1=1;

通常用于取位操作,如常取末位:num&1结果就是取num的二进制的最末位,而以此可判别num的奇偶,结果为0则为偶,结果为1则为奇

2.|运算:两个数二进制对应位有一者为1那一位即为1
1
2
3
4
0|1=0
0|1=1
1|0=1
1|1=1

通常用于二进制特定位上的无条件赋值,如num|1结果是把二进制最末尾强行变为1,若再在这个结果上减1,可将num变为最接近它的偶数

3.^运算:二进制位同则0,异则1
1
2
3
4
0^1=1
1^0=1
1^1=0
0^0=0

常有操作1:一个数num1两次异或一个数num2结果仍为num1

1
2
3
4
5
6
7
8
9
//num1^num2^num2=num1
//num1^num2^num1=num2
//在交换两数中的运用
void swap(long &a,long &b)
{
a=a^b;
b=a^b;//这里已经a赋值给了b,因为这里b=a^b^b
a=a^b;//同理这里将b赋值给了a
}

常有操作2:简单加密

1
2
3
4
原始值:int a=19880516;
密钥:int key=1314520;
加密:int data=key^a=20665500;
解密:data^key=a
4.~运算:按位取反,0则1,1则0

表现为该变量数据类型的上界限减该变量的值

三、位移运算

1.<<运算:将二进制位集体向左移相应位

a<<b表现为a乘以2的b次方

2.>>运算:将二进制位集体向右移相应位

a>>b表现为a除以2的b次方,常将>>1用于代替/2,如在二分查找,堆的插入操作中。用>>代替除法可以使得程序效率大大提高,最大公约数的二进制算法用除以2操作代替慢的取余%,效率可以提高60%。然后最小公倍数可用两数乘积除以最大公约数得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//求最大公约数
//1/更相减损术
long long measure(long long a,long long b)
{
while(a != b)
{
if(a>b)
{
a = a - b;
}
else
{
b = b - a;
}
}
return a;
}

//2.位运算求解最大公约数
long long gcd(long long a,long long b)
{
if(a<b) return gcd(b,a);
if(b==0) return a;
if((a&1)==0&&(b&1)==0) return 2*gcd(a>>1,b>>1);//a and b are even
if((a&1)==0) return gcd(a>>1,b); // only a is even
if((b&1)==0) return gcd(a,b>>1); // only b is even
return gcd((a+b)>>1,(a-b)>>1); // a and b are odd
}

- ❗只需要保证 最开头的 文章属性 内容 语法正确 则会被系统自动识别 编写日期 标题 分类 和 标签 封面的属性