
鸽子的我又来更新了~
程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作
为什么用?因为他快啊!
运算符 | 示例 | 作用 |
& (与) | a&b | a和b的二进制中表示中,相同位的两个数字都为1,才能是1 |
| (或) | a|b | 相同位只要一个为1即为1 |
︿ (异或) | a︿b | 如果某位不同则该位为1,否则该位为0 |
~ (取反) | ~a | 0和1全部取反 |
<< (左移) | a<<b | 就表示把a转为二进制后左移b位(在后面添b个0) |
>> (右移) | a>>b | 表示二进制右移b位(去掉末b位) |
----------------------------------------------------------------------------------------------------------------------
第三级别(既有右结合性) |
|
! | 逻辑取反 |
not | !的另一种表达 |
~ | 按位取反 |
第五级别 |
|
* | 乘法 |
/ | 除法 |
% | 取余数(横运算) |
第六级别 |
|
+ | 加法 |
- | 减法 |
第七级别 |
|
<< | 位左移 |
>> | 位右移 |
第八级别 |
|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
第九级别 |
|
== | 恒等于 |
eq | 恒等于 |
!= | 不等于 |
not_eq | 不等于 |
第十级别 |
|
& | 位且运算 |
bitand | 位且运算 |
第十一级别 |
|
︿ | 位异或运算 |
xor | 位异或运算 |
第十二级别 |
|
| | 位或运算 |
bitor | 位或运算 |
--------------------------------------------------------------------------------------------------------------------------------
与应用
&运算:通常用于二进制取位操作
int A;
cin>>A;
if(a&1)
cout<<"奇数";
else
cout<<"偶数"
A&1的结果就是取A的二进制的最末位
--------------------------------------------------------------------------------------------------------------------------------
进制输入输出
头文件 :iomanip
dec:十进制
hex:十六进制
oct:八进制
%d:十进制
%x:十六进制
%o:八进制
//十六进制
int a;
a=0x0027;
cin>>hex>>a;
a=027;
cin>>oct>>a;
cin>>dec>>a;
cout>>oct>>a;
printf("%x",a);
printf("%o",a);
--------------------------------------------------------------------------------------------------------------------------------
#include<iostream>
#include<cstdio>
#include<climits>
using namespace std;
int main(){
cout<<INT_MAX<<endl;
cout<<hex<<TNT_MAX<<endl;
cout<<dec<<TNT_MIN<<endl;
cout<<hex<<TNT_MIN<<endl;
int a=0xffffffff;
cout<<dec<<a<<endl;
return 0;
}
输出为:
2147483647
7fffffff
-2147483648
80000000
-1
--------------------------------------------------------------------------------------------------------------------------------
求反应用
int main(){
int a=-7;
int b=~a;
cout<<b<<endl;
a=7;
b=~a;
cout<<b<<endl;
return 0;
}9
输出:
6 -8
对一个有符号的数进行求反运算后,最高位的变化将导致正负颠倒,并且数的绝对值会差1。也就是说,~a实际上等于-a-1。
--------------------------------------------------------------------------------------------------------------------------------
右移运动
a>>b就表示把a转为二进制后右移b位。正数高位补0,负数高位补1.
相当于a除以2的b次方(取整)。
我们也经常用>>1来代替除2操作。
--------------------------------------------------------------------------------------------------------------------------------
取某些位:
int a=0x29; //(101001)2
取末位:
a&1
int main(){
int a=109;
cout<<(a&1);
return 0;
2.取末三位:
a&(111)下标2
a&(1000-1)下标2
a&((1<<3)-1)
3.取末k位:
a&((1<<k)-1)
--------------------------------------------------------------------------------------------------------------------------------
int a=0x29; //(101001)下标2
4.取右数第三位:
a>>2&1
5.取右数第k位:
(a>>k-1)&1
给某些位赋值:(赋1)
int a=0x2A; //(101010)下标2
1.最后一位变成一:
a|1
2.把右数第三位变成一:
a|1<<2
--------------------------------------------------------------------------------------------------------------------------------
给某些位赋值:(赋0)
int a=0x29; //(101001)下标2
最后一位变成0:
(a|1)-1
2.把右数的第四位变成零:
a&~(1<<3)
3.把右数第k位变成零
a&~(1<<k-1)
--------------------------------------------------------------------------------------------------------------------------------
给某些位赋值:(求反)
int a=0x29; //(101001)下标2
1、最后一位求反:
a^1
2、右数第3位求反:
a^1<<2
3、右数第k位求反:
a^1<<k-1
--------------------------------------------------------------------------------------------------------------------------------
1.如何O(1)的时间将一个数X的最低位的1去掉?
例如:
X=6 其二进制为:(110)下标2
X去掉最低位的1为:(110)下标2
x&(x-1)
2.如何O(1)的时间只保留一个数X的最低位的1?
例如:
X=6 其二进制为:(110)下标2
X只保留最低位1为:(10)下标2
说明:
lowbit(x)=x&(~x+1)
--------------------------------------------------------------------------------------------------------------------------------
补码中:
~x+1=-x
lowbit(x)=x&-x
XM.O-内部文章-请勿转载-谢谢