用C++讨论“位运算符”,编程补充学习由此开始(第十二节)
C++语言可以说是C语言的继承,两者有很多共通之处。
不过今天的主要内容是“位运算符”的讲解,因为这段时间我在实习嘛,用到的编程语言也都是C++,所以也想记录C++的学习笔记,以帮助自己梳理逻辑和学习。
位运算符,那么主要作用于位的,位是数据存储的最小单位,也称为比特,像二进制中的0或1就是一个位。
位运算符的类型
那么位运算符有多少种呢,分别有按位与运算&,按位或运算|,按位异或运算^,按位取反运算~,二进制左移运算<<和二进制右移运算>>。
大家其实可以发现,位运算与逻辑运算有着相似的地方,那就是按位与运算与按位或运算,不就是逻辑运算中的与运算少了一个&符号和或运算少了一个|符号吗。
话虽如此,但逻辑运算与位运算之间还是有着很大的区别的,两者所针对的数据类型明显是不同的。
按位与运算&、按位或运算|、按位异或运算^
按位与运算,就是把两个数用二进制的方式进行“与”运算,以数据a=10,b=9为例。
十进制a等于10,那么二进制就等于1010,十进制b等于9,那么二进制就等于1001。
两者进行与运算,就得到1000,十进制的结果为8。
同理,按位或运算得到1011,十进制的结果为11。
按位异或运算得到0011,十进制的结果为3。
可以发现,位运算符的主要作用就是把数据转化为二进制,然后再来进行位运算。
与运算符是需要两者皆满足1时,结果才等于1,或运算符只需要两者中有一者满足等于1,结果就等于1,而按位异或运算则是要两者都相同等于0,否则不相同则为1。
取反运算~、二进制左移<<、二进制右移>>
取反运算,顾名思义,就是按位取反,比方说给定整数a=10,那么它的二进制为1010,此时我们把它补全一点,得到001010,取反得到110101,然后第一个数1则代表负数,那么就是-16与5相加,得到-11,我个人是这样理解的。
但还有其它的理解方法,这就涉及到补码、反码和原码之间的概念差别了,这个我之后会再提到,大家不用担心。
而二进制左移运算和右移运算很明确,就是把整个二进制数向左移若干位,或者向右移若干位,得到最终结果即可。
代码实现
#include <iostream>
using namespace std;//使用std命名空间
int main()
{
int a = 10;
int b = 9;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
c = a & b;//与运算
d = a | b;//或运算
e = a ^ b;//异或运算
f = ~a;//取反运算
g = a << 1;//二进制左移运算
h = a >> 1;//二进制右移运算
std::cout << "与运算a&b为:" << c << endl;
std::cout << "或运算a|b为:" << d << endl;
std::cout << "异或运算a^b为:" << e << endl;
std::cout << "取反运算~a为:" << f << endl;
std::cout << "二进制左移运算a<<1为:" << g << endl;
std::cout << "二进制右移运算a>>1为:" << h << endl;
system("pause");
return 0;
}
结果测试
总结
总的来说,位运算其实难度不大,但基础概念还是要清楚的,比方说左移符号,那就要记住整个二进制数向左移动,是大于左边,所以是左移符号,而右移符号则是大于右边,至于取反运算符,则是需要掌握原码、补码和反码之间的关系,这个内容我之后还会提到。