
鸽子的我又来更新了~
程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算就是直接对整数在内存中的二进制位进行操作
为什么用?因为他快啊!
| 运算符 | 示例 | 作用 |
| & (与) | 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-内部文章-请勿转载-谢谢