//位运算   与& 或| 非~ 异或^  
             int x = 10; //00001010
             int y = 5;  //00000101
            &:逐位进行与运算:1&1 =1          1&0 =0         0&0 =0    
             int result_and = x & y; //0
            |:逐位进行或运算:1|1 =1          1|0 =1         0|0 =0
             int result_or = x | y; //15
            异或:1^1 = 0         0^0 = 0         1^0 = 1 
             int result_xor = x ^ y;//15
            ~:逐位取反,0 =>1        1=>0
             int result_not = ~x;//-11,如果8位字节数最高位是1,就表示负数,涉及源码,数码,补码的转换.
             
             //<< 
             //左移操作符,
             //将操作符左侧为操作数,操作符右侧为向移动的位数,一个字节8位,移动后空出的高位位置补0。
             //左移相当于乘.左移一位相当于乘2; 左移两位相当于乘4; 左移三位相当于乘8,如下:
             //x << 1 = x * 2
             //x << 2 = x * 4
             //x << 3 = x * 8
             //x << 4 = x * 16
            //总结:
             //右移 i >> count:也就是i / (2的count次方),再向下取整
             //左移i << count:也就是i x (2的count次方)
             
             //如何判断data的第n bit位是0还是1,寻找参考数,该数字除了第n bit位是1,其它bit都是0,这就用到了左移右移操作符,如下示例: 
             int data = 0xFE;    //11111110
             int ref_data = (1 << 5);//00000001左移5位,得到00100000
             int z = data & ref_data;  //若X第六6位0,则位与结果z为0,否则Z为32. 所以只需要判断z是否为0,就知道X的第六位是0,否则为1.
             bool is_1 = (data & ref_data) >> 5 == 1 ? true : false;//或者将与参考数的运算结果右移5位,即可得到0或1
            //将16进制数,高word,最低的半个字节,即3,摘出来
             uint ui = 0x28F3E659; //32bit unsigned interger
             uint ui1 = ui & 0x000F0000;//除了要取的数字,其他不相关的数字全部置零
             uint ui2 = ui1 >> 16;//右移16位,即可取出