位运算符是用来对二进制位进行操作的
c语言中有6种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
右移>> (带符号右移)> > >(无符号右移)
1.按位与& 运算符
按位与运算符“&”是双目运算符。
其功能是参与运算的两数各对应的二进位相与。
只有对应的两个二进位都为1时,结果位才为1。
千万不要与 && 混淆
首先把数转换为2进制
比如:
10 二进制为:1010
11 二进制为:1011
1 0 1 0
1 0 1 1
1 0 1 0
注意:有对应的两个二进位都为1时,结果位才为1
结果 1010 还是10
10 & 11 等于 10
code:
#include <iostream>
int main()
{
auto i1 = 10; //2进制:1010 , 10进制:10
auto i2 = 20; //2进制:10100 , 10进制:20
std::cout << (i1 & i2)<<std::endl; //2进制00000 10进制:0
/* 步骤: 当两个都为1时,才为1
1 0 1 0
1 0 1 0 0
---------
0 0 0 0 0
*/
auto i3 = 11;
std::cout << (i1 & i3); //2进制:1010 10进制:10
/* 步骤: 当两个都为1时,才为1
1 0 1 0
1 0 1 1
---------
1 0 1 0
*/
system("pause");
}
2.按位或| 运算符
按位或运算符“|”是双目运算符。
其功能是参与运算的两数各对应的二进位相或。
只要对应的二个二进位有一个为1时,结果位就为1
首先把数转换为2进制
比如:
10 二进制为:1010
11 二进制为:1011
1 0 1 0
1 0 1 1
1 0 1 1
只要对应的二个二进位有一个为1时,结果位就为1
code:
int main()
{
auto i1 = 10; //2进制:1010 , 10进制:10
auto i2 = 20; //2进制:10100 , 10进制:20
std::cout << (i1 | i2) << std::endl; //2进制11110 10进制:30
/* 步骤: 当有一个为1时,就为1
1 0 1 0
1 0 1 0 0
---------
1 1 1 1 0
*/
auto i3 = 11;
std::cout << (i1 | i3); //2进制:1011 10进制:11
/* 步骤: 当有一个为1时,就为1
1 0 1 0
1 0 1 1
---------
1 0 1 1
*/
}
3.按位异或^ 运算符
当前位的两个二进制表示不同则为1相同则为0
首先把数转换为2进制
比如:
10 二进制为:1010
11 二进制为:1011
1 0 1 0
1 0 1 1
0 0 0 1
注意:当前位的两个二进制表示不同则为1相同则为0
结果 0001 是1
10 & 11 等于 1
Code:
int main()
{
auto i1 = 10; //2进制:1010 , 10进制:10
auto i2 = 20; //2进制:10100 , 10进制:20
std::cout << (i1 ^ i2) << std::endl; //2进制11110 10进制:30
/* 步骤: 当前位的两个二进制表示不同则为1相同则为0
1 0 1 0
1 0 1 0 0
---------
1 1 1 1 0
*/
auto i3 = 11;
std::cout << (i1 ^ i3); //2进制:1011 10进制:1
/* 步骤: 当前位的两个二进制表示不同则为1相同则为0
1 0 1 0
1 0 1 1
---------
0 0 0 1
*/
}
4. 按位取反 ~ 运算符
因为涉及到 补码 原码 符号,感觉挺复杂的,涉及的知识比较多
总结为一句:
对所有整数取反=本身的相反数-1
~9 = -10
~10 = -11
5.左移和右移运算符
左移:
右移:
总结:
code:
#include <iostream>
int main()
{
auto i = 11; //2进制: 1011 ,10进制:11
i = i << 1; //左移1位
std::cout << i; //2进制: 10110 ,10进制:22
i = i << 1; //继续左移1位
std::cout << i; //2进制: 101100 ,10进制:44
auto i2 = 11;
i2 = i2 >> 1; //右移
std::cout << i2; //2进制: 101 ,10进制:5
i2 = i2 >> 1; //继续右移一位
std::cout << i2; //2进制: 10 , 10进制:2
system("pause");
}