说起运算符,我们之前了解了,算数运算符(+-*/%),逻辑运算符(&&,||,!),关系运算符(><,==),都是和生活息息相关的,所以理解起来比较简单,但是我们今天要认识的是位运算符。
位运算符是什么
位运算符是在计算机编程中用于直接操作整数的二进制位的运算符。它们对整数进行操作时,会把整数看作一系列的二进制位来进行处理。
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
然后把他们二进制每个位上的数进行比较。像图这个样子。然后我们就可以得到。
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
位运算有什么作用
了解和掌握位运算对于成为一个全面的程序员是非常有用的,尤其是在系统级编程、游戏开发、嵌入式系统等领域,位运算符呢经常用于各种场景:
-
数据压缩和加密算法:位运算可以用来快速地对数据进行位级的操作,这对于实现高效的数据压缩和加密算法非常重要。
-
硬件控制:在底层编程中,位运算被用于读写硬件寄存器,控制硬件设备的特定功能。
-
位标记和标志:位运算可以用来设置或检查某个特定的标志位,比如权限位、状态位等。
-
数学和逻辑运算:位运算可以用于实现一些高效的数学和逻辑运算,如乘法、除法、取模等。
-
优化性能:在某些情况下,位运算比传统的算术运算更快,可以用于提高程序的运行效率。
-
考试中:在编程考试中位操作非常常见,尤其是理解计算机原理这一块
如何理解位运算符
-
按位与 (
&
): 这个运算符比较两个数值的每一位,如果两位都是1,则结果位为1;否则结果位为0。cppa = 5 # 二进制: 0101 b = 3 # 二进制: 0011 result = a & b # 结果: 0001, 十进制: 1
cppc = 10 # 二进制: 1010 d = 4 # 二进制: 0100 result = c & d # 结果: 0000, 十进制: 0
-
按位或 (
|
): 如果两个比较位中至少有一个是1,则结果位为1;否则结果位为0。cppa = 5 # 二进制: 0101 b = 3 # 二进制: 0011 result = a | b # 结果: 0111, 十进制: 7
cppc = 10 # 二进制: 1010 d = 4 # 二进制: 0100 result = c | d # 结果: 1110, 十进制: 14
-
按位异或 (
^
): 如果两个比较位不同,则结果位为1;否则结果位为0。cppa = 5 # 二进制: 0101 b = 3 # 二进制: 0011 result = a ^ b # 结果: 0110, 十进制: 6
cppc = 10 # 二进制: 1010 d = 4 # 二进制: 0100 result = c ^ d # 结果: 1110, 十进制: 14
-
按位取反 (
~
): 这是一个一元运算符,它会反转一个数的每一位,1变成0,0变成1。在大多数语言中,它实际上是计算补码的相反数。cppa = 5 # 二进制: 00000101 (假设整数为8位) result = ~a # 结果: 11111010, 十进制: -6 (注意,这里考虑了二进制补码表示)
cppc = 10 # 二进制: 00001010 (假设整数为8位) result = ~c # 结果: 11110101, 十进制: -11
-
左移 (
<<
): 这个运算符将二进制位向左移动指定的位置数,高位丢失,低位补零。cppa = 5 # 二进制: 0101 result = a << 2 # 结果: 010100, 十进制: 20
cppc = 10 # 二进制: 1010 result = c << 1 # 结果: 10100, 十进制: 20
-
右移 (
>>
): 这个运算符将二进制位向右移动指定的位置数,低位丢失,高位根据符号位(有符号数)或补零(无符号数)填充。cppa = 20 # 二进制: 10100 result = a >> 2 # 结果: 0101, 十进制: 5
cppc = 20 # 二进制: 10100 result = c >> 1 # 结果: 01010, 十进制: 10
学习和总结
假设变量 A 的值为 60,变量 B 的值为 13,则:
二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; |
(A & B) 将得到 12,即为 0000 1100 |
| | 按位或运算符,按二进制位进行"或"运算。运算规则: ``` 0 | 0=0; 0 |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则: 0^0=0; 0^1=1; 1^0=1; 1^1=0; |
(A ^ B) 将得到 49,即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算。运算规则: ~1=-2; ~0=-1; |
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |
相信看到这里,你们以及大概理解了位运算的结果,说实话我工作十年是没有遇到过需要用位运算的情况,但是接触教育的这几年,频繁的刷到考试题,因此算是查漏补缺吧。
加油,有任何问题我们评论区交流吧