位运算: 一个数的二进制的每一位进行的运算
位运算符:
& 按位与 //&& 逻辑与(一假为假,同真为真)
参与运算的二进制位进行与操作(都是1的时候才为1,否则为假)
例: 9&1
00001001
00000001
-------------------
00000001 1
| 按位或
参与运算的二进制位进行或操作(有1则为1,同0则为0)
9|1
00001001
00000001
---------------------
00001001 9
^ 按位异或
参与运算的二进制位进行异或操作(相同为0,不同为1)
9^1
00001001
00000001
---------------------
00001000 8
~ 按位取反(单目运算)
参与运算的二进制位进行取反操作(1变0 0变1)
~9
00001001
~
-------------------
11110110
<< 按位左移
参与运算的二进制位进行按位(逐位)的左移操作
注意:
1)移出的位直接丢弃,右侧补0
2)左移可能改变一个数的正负型
3)一个数左移n,就相等这个数乘以 2^n
9<<2; //9*4
9<<4; //9*16
000000 00000000 00000000 0000100100
|
100000 00000000 00000000 00000000111
>> 按位右移
参与运算的二进制位进行按位(逐位)的右移操作
注意:
1)移出的位直接丢弃,左侧补符号位
2)右移不会改变一个数的正负性
3)一个数右移n,就相等这个数除以 2^n
16>>2 // 16 / 4 =4
16>>3 // 16 / 8 =2
00000000000 00000000 00000000 00010
|
如果是一个数是偶数,最低位0
奇数 1
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 9,b=1;
int c;
c = 9&1; //按位与
c = 9|1; //按位或
c = 9^1; //按位异或
c = ~9;
c = 0b10000000000000000000000000000111;
int k = -2147483641;
c = k<<2;
c = 9<<4;
printf("c = %d\n",c);
return 0;
}
|