//位运算 与& 或| 非~ 异或^
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位,即可取出