一、认识位运算符
运算符名称 | 符号 |
按位与 | & |
按位或 | | |
取反 | ~ |
异或 | ^ |
左移 | << |
右移 | >> |
注:
1.&和&&的区别:(|和||同理)
eg: eg:
15&127=15 15&&127=1
原因解释:(从二进制来看) 原因解释:
15(00001111) 两个数都不为0,即都为真,故为1.
127(11111111)
按位取与便是15(00001111)
2.位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
二、位运算符的运用
1.与(&)运算符的运用
1.1.判断奇偶(最后一位,奇数为1,偶数为0)
int main()
{
int num=99;
int judge = 1;
cout << (num & judge ? "奇数" : "偶数") << endl;
}
1.2.判断2的整数幂
int num = 64;
int judge = num - 1;
cout << ((num & judge) ? "no" : "yes") << endl;
2的整数幂 后面皆为0,首位为1
减1后,后面皆为1,首位为0
1.3.汉明权重问题
没太看懂,详见:C语言-统计二进制数中1的个数-Hamming weight-汉明权重问题_kuweicai的博客-CSDN博客
2.异或(^)运算符(同为0,异为1)
异或运算符需要理解的结论:
(1)a^a=0;
(2)a^0=a;(0的二进制每一位都为0;0^0=0,0^1=1;)
2.1交换整型变量(不用第三个变量)
代码:
void swap(int& a, int& b)
{
a = a ^ b;
b = a ^ b;
a = b ^ a;
}
结果展示:
理解:
1.a=a^b
2.b=a^b这步表示:b=(a^b)^b=a^(b^b)=a^0=a;
3.a=b^a这步表示:a=a^(a^b)=(a^a)^b=0^b=b;
2.2.交换double类型变量
代码:(加一步强转int)
void swap(double& a, double& b)
{
a = (int)a ^ (int)b;
b = (int)a ^ (int)b;
a = (int)b ^ (int)a;
}
3.左移(<<)和右移(>>)运算
理解:
左移:在符号位不为1的情况下,相当于乘2,右边补0
右移:
对于无符号数,左边补0
对于有符号数
若符号位为0,则左边还是补0
若符号位为1,则左边补什么由不同系统决定
代码测试:
代码:
int main()
{
int a = -11;
cout << a << endl;
cout << bitset<sizeof(int) * 8>(a) << endl;
a=a << 2;
cout << a << endl;
cout << bitset<sizeof(int) * 8>(a) << endl;
a=a >> 3;
cout << a << endl;
cout << bitset<sizeof(int) * 8>(a) << endl;
}
注:如何查看数字二进制编码:
头文件:#include<bitset>
格式:bitset<sizeof(int)*8>(a)
参考文章: