[C/C++入门][进制原理]28、计算机中二进制的位运算符(完全理解位运算)

说起运算符,我们之前了解了,算数运算符(+-*/%),逻辑运算符(&&,||,!),关系运算符(><,==),都是和生活息息相关的,所以理解起来比较简单,但是我们今天要认识的是位运算符。

位运算符是什么

位运算符是在计算机编程中用于直接操作整数的二进制位的运算符。它们对整数进行操作时,会把整数看作一系列的二进制位来进行处理。

假设如果 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,则结果位为1;否则结果位为0。

    cpp 复制代码
    a = 5  # 二进制: 0101
    b = 3  # 二进制: 0011
    result = a & b  # 结果: 0001, 十进制: 1
    cpp 复制代码
    c = 10  # 二进制: 1010
    d = 4   # 二进制: 0100
    result = c & d  # 结果: 0000, 十进制: 0
  2. 按位或 (|): 如果两个比较位中至少有一个是1,则结果位为1;否则结果位为0。

    cpp 复制代码
    a = 5  # 二进制: 0101
    b = 3  # 二进制: 0011
    result = a | b  # 结果: 0111, 十进制: 7
    cpp 复制代码
    c = 10  # 二进制: 1010
    d = 4   # 二进制: 0100
    result = c | d  # 结果: 1110, 十进制: 14
  3. 按位异或 (^): 如果两个比较位不同,则结果位为1;否则结果位为0。

    cpp 复制代码
    a = 5  # 二进制: 0101
    b = 3  # 二进制: 0011
    result = a ^ b  # 结果: 0110, 十进制: 6
    cpp 复制代码
    c = 10  # 二进制: 1010
    d = 4   # 二进制: 0100
    result = c ^ d  # 结果: 1110, 十进制: 14
  4. 按位取反 (~): 这是一个一元运算符,它会反转一个数的每一位,1变成0,0变成1。在大多数语言中,它实际上是计算补码的相反数。

    cpp 复制代码
    a = 5  # 二进制: 00000101 (假设整数为8位)
    result = ~a       # 结果: 11111010, 十进制: -6 (注意,这里考虑了二进制补码表示)
    cpp 复制代码
    c = 10  # 二进制: 00001010 (假设整数为8位)
    result = ~c       # 结果: 11110101, 十进制: -11
  5. 左移 (<<): 这个运算符将二进制位向左移动指定的位置数,高位丢失,低位补零。

    cpp 复制代码
    a = 5  # 二进制: 0101
    result = a << 2  # 结果: 010100, 十进制: 20
    cpp 复制代码
    c = 10  # 二进制: 1010
    result = c << 1  # 结果: 10100, 十进制: 20
  6. 右移 (>>): 这个运算符将二进制位向右移动指定的位置数,低位丢失,高位根据符号位(有符号数)或补零(无符号数)填充。

    cpp 复制代码
    a = 20  # 二进制: 10100
    result = a >> 2  # 结果: 0101, 十进制: 5
    cpp 复制代码
    c = 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

相信看到这里,你们以及大概理解了位运算的结果,说实话我工作十年是没有遇到过需要用位运算的情况,但是接触教育的这几年,频繁的刷到考试题,因此算是查漏补缺吧。

加油,有任何问题我们评论区交流吧

相关推荐
_.Switch15 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
徐*红16 分钟前
java 线程池
java·开发语言
尚学教辅学习资料16 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
1 9 J18 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship19 分钟前
Java面试题(2)
java·开发语言
J不A秃V头A21 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
lb36363636363 小时前
介绍一下数组(c基础)(详细版)
c语言
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言