#include <iostream>

using namespace std;

int main(){
    //位运算一般都有运算表
    // AND与& 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 //0与上任何数都是0
    // OR或| 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1//1或上任何数都是1
    // NOT取反~ ~0 = 1 ~1 = 0
    // XOR异或^ 0 ^ 0 = 0 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1
    
    //NAND与非
    //NOR或非
    
    int a = 3, b = 6; //假使 对a, b做位运算 ^异或
    // a ^ b; //做位运算指对每一个二进制的位数做位运算
    //011 110 1^0 = 1 1^1 = 0 0^1 = 1 所以是101
    
    cout << (a ^ b) << endl;
    
    //除了上面的位运算之外还有两个位运算是左移和右移
    
    //右移 就把一整个数向右移动一位 把移出去的数删掉就可以了
    //a >> 110110 //11011m   //右移 等价于 a 除上 2的k次方
    //a << 1 //左移 等价于 a 乘以 2的k次方
    
    
    
    //常用操作
    //如果我们想去除第k位数字 就可以 a >> k & 1
    
    int d = 13;
    for(int i = 5; i >= 0; i--) cout << (d >> i & 1);
    return 0;
    //lowbit 运算 返回x的最后一位1
    //a & -a 1010110010000 先把这个数取反 也就是~a = 0101001101111
                                        //然后~a+1 = 0101001110000
                                        //然后&一下就0000001000000
                                    //a & (~a + 1)就可以得到求的这个数了
                                    //在计算机里面 是用补码来存负数的
                //所以-a的二进制表示 和~a + 1的二进制表示是完全一样的
                //所以后面的 ~a + 1可以写成-a也就是 a & -a
}