# 位运算bitset应用
## 位运算分为 << >> ~ & | ^
引用 bitset 头文件
#include < bitset >
std::birset <要显示的二进制位数> (要显示的变量);
int a {(int)0b11111111111111111111111111111111};
`std::cout<<std::birset<32>(a);`
注:
我们知道int类型的一个字符占用4个字节,1个字节是8个b(节)所以就是4X8=32 , int 类型的二进制位数就是 32
a 是自定义的变量名称
**### 在bitset运算中,对字符数据类型 整型与非整型要求非常严格,所以我们要带上 unsigned (视自己程序而定)**
## 位运算:
## 左移 <<
运算可写作
`a=a<<1;`
注:左移 << 1 在10进制里是 X2的意思,比如一个10进制数“10”在左移1位后,变成“20 ”
左移 << 2 在10进制里是X2的2次方,也就是2x2x10=40
在2进制里是 *2的意思,比如一个2进制数11111111在左移一位后变成 01111111
## 右移 >>
运算可写作
`a=a>>1;`
注:右移 >> 1 在10进制里是 ÷2的意思,比如一个10进制数“10”在右移1位后,变成“5 ”
右移 >>2 在10进制里是÷2的2次方,也就是10÷(2X2)去掉小数得2
在2进制里是 ÷2的意思,比如一个2进制数11111111在左移一位后变成 11111110
![](https://img.kancloud.cn/c9/39/c939dbb7b85195bbaca69797022e764e_941x383.png)
## int类型的二进制里,在有符号的 int 里做右移>>运算的时候,某些CPU里默认是补 “1”的,因为默认为负数, 在unsigned int里补位就为“0”了。
## 因为在计算机设计初期,要保证负数的运算结果为负数,所以默认设计为补 “1”
# 反运算 ~
### `a=~a;`
比如
1111111100000000
反运算就成了
0000000011111111
### 与预算&
运算规则:
0&0=0;0&1=0;1&0=0;1&1=1
比如
a的值是:0000000
b的值是:11111111
那么a&b
就等于0000000
### 即:两个同时为1,结果为1,否则为0
### 或运算|
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
a的值是:0000000
b的值是:11111111
那么a|b
就等于11111111
### 即:两个同时为0,结果为0,否则为1