注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/101105913
C++ 按位运算符 OR(|), AND(&), XOR(^)
1 | 按位或运算符
OR(|) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑或操作(两个值只要有1,结果为1,否则为0)。例如:
(1)
int a = 1;
int b = 1;
int c =( a | b);
cout << c << endl;
c=1
(2)
int a = 0;
int b = 1;
int c =( a | b);
cout << c << endl;
cout << endl;
c=1
(3)
int a = 0;
int b = 0;
int c =( a | b);
cout << c << endl;
c=0
(4)
int a = 1;
int b = 2;
int c =( a | b);
cout << c << endl;
cout << endl;
先将1,2分别转为二进制,01,10。然后进行或操作,二进制结果为11,转为十进制为3.
因此 c=3 .
2 & 按位与运算符
AND(&) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑与操作(两个值都为1,结果为1,否则为0)。例如:
(1)
int a = 1;
int b = 1;
int c =( a & b);
cout << c << endl;
c=1
(2)
int a = 1;
int b = 0;
int c =( a & b);
cout << c << endl;
c=0
(3)
int a = 0;
int b = 0;
int c =( a & b);
cout << c << endl;
c=0
(4)
int a = 1;
int b = 2;
int c =( a & b);
cout << c << endl;
先将1,2分别转为二进制,01,10。然后进行与操作,二进制结果为00,转为十进制为0.
因此 c=0 .
3 ^ 按位异或运算符
XOR(^) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑异或操作(两个值不同时结果为1,两个值相时结果为0)。例如:
(1)
int a = 1;
int b = 1;
int c =( a ^ b);
cout << c << endl;
c=0
(2)
int a = 0;
int b = 1;
int c =( a ^ b);
cout << c << endl;
c=1
(3)
int a = 0;
int b = 0;
int c =( a ^ b);
cout << c << endl;
c=0
(4)
int a = 1;
int b = 2;
int c =( a ^ b);
cout << c << endl;
先将1,2分别转为二进制,01,10。然后进行异或操作,二进制结果为11,转为十进制为3.
因此 c=3 .
4 ^ 求反运算符
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
例如~9 的运算为:
~(0000000000001001) 结果为: 1111111111110110
5 << 左移运算符
左移运算符“ <<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补 0。
左移相当于该数乘以2的n次方。
例如:
a<<4;
指把 a 的各二进位向左移动 4 位。如 a=00000011(十进制 3),左移 4 位后为 00110000(十进制 48)。(可以理解a的二进制左移4位,右边补0)
问:
A) i=i*8;
B) i=i<<3;
A和B哪个语句执行速度快?
答案:选项B速度快
6 >> 右移运算符
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位, “>>”右边的数指定移动的位数。
右移相当于该数除以2的n次方,前提是数据不能丢失。
例如:
设 a=15;
a>>2;
表示把 000001111 右移为 00000011(十进制 3)。(可以理解a的二进制右移2位,左边补0)
问:
A) i=i/8;
B) i=i>>3;
A和B哪个语句执行速度快?
答案:选项B速度快
位运算度的意义: 通过位运算符可以对数据的操作精确到每一位。