[软件资料] 位运算符

[复制链接]
500|10
 楼主| forgot 发表于 2025-3-24 17:10 | 显示全部楼层 |阅读模式
C 语言位操作符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。  
按位与(&)
只有当两个二进制位都为 1 时,它才会给出 1 的裁决,否则就是 0。例如,对 5(二进制表示为 0000 0101)和 3(二进制表示为 0000 0011)进行按位与操作时,0000 0101 & 0000 0011 = 0000 0001,结果为 1。按位与操作常常用于清零特定位或者提取指定位的数据。

按位或(|)
只要两个二进制位中有一个为 1,它就会给予 1 的馈赠,只有当两个位都为 0 时,才会给出 0。比如,5 | 3,0000 0101 | 0000 0011 = 0000 0111,结果为 7。按位或操作常用于将特定位设置为 1。

按位异或(^)
当两个二进制位不同时,它会创造出 1 的独特效果,而当两个位相同时,结果为 0。以 5 ^ 3 为例,0000 0101 ^ 0000 0011 = 0000 0110,结果是 6。按位异或操作在数据加密、校验和数据交换等场景中应用较多。


按位取反(~)
将二进制位中的 0 变成 1,1 变成 0。对于 5(0000 0101),~5 的结果是 1111 1010,由于计算机中数据以补码形式存储,这里的结果是一个负数,其原码为 1000 0110,对应的十进制值为 -6。


左移(<<)
将二进制位向左移动指定的位数,右边空出的位用 0 填充。例如,5 << 2,0000 0101 << 2 = 0001 0100,结果为 20。左移操作相当于对原数乘以 2 的移动位数次方,是一种高效的乘法运算方式。


右移(>>)
则是将二进制位向右移动指定的位数。对于无符号数,左边空出的位用 0 填充;对于有符号数,若为正数,左边用 0 填充,若为负数,左边用符号位(即 1)填充。例如,5 >> 1,0000 0101 >> 1 = 0000 0010,结果为 2;而 -5 >> 1,1111 1011 >> 1 = 1111 1101,结果为 -3(这里以补码形式表示,原码为 1000 0011)。右移操作相当于对原数除以 2 的移动位数次方,是一种高效的除法运算方式。   
xiaoqizi 发表于 2025-5-9 18:31 | 显示全部楼层
C语言中的位运算符是直接对整数的二进制位进行操作的运算符
木木guainv 发表于 2025-5-9 20:18 | 显示全部楼层
按位与将两个操作数的每一位进行与操作。只有当两个相应的二进制位都为1时,该位的结果才为1,否则为0
Jiangxiaopi 发表于 2025-5-9 21:59 | 显示全部楼层
按位与可用于清零、取一个数中某些指定位、保留指定位等
荣陶陶 发表于 2025-5-10 07:24 | 显示全部楼层
按位或将两个操作数的每一位进行或操作。只要两个相应的二进制位中有一个为1,该位的结果就为1,否则为0
Zhiniaocun 发表于 2025-5-10 09:07 | 显示全部楼层
按位异或:
int a = 60;  // 60的二进制表示是0011 1100
int b = 13;  // 13的二进制表示是0000 1101
int c = a ^ b;  // 结果是0011 0001,即49


Zuocidian 发表于 2025-5-10 10:50 | 显示全部楼层
下面代买实现了按位取反:
int a = 60;  // 60的二进制表示是0011 1100
int b = ~a;  // 结果是 -61,二进制表示(补码)是1100 0011


Puchou 发表于 2025-5-10 12:55 | 显示全部楼层
左移操作:将左操作数的二进制位向左移动若干位,右侧空出的位用0填充,高位移出的部分被丢弃
Xiashiqi 发表于 2025-5-10 14:46 | 显示全部楼层
右移代码:
int a = 10;  // 10的二进制表示是0000 1010
int b = a >> 1;  // 结果是5,二进制表示是0000 0101


小海师 发表于 2025-5-10 16:39 | 显示全部楼层
右移的时候,对于有符号数,高位补符号位;对于无符号数,高位补0
Haizangwang 发表于 2025-5-10 18:22 | 显示全部楼层
按位异或可用于交换两个变量的值而不用临时变量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2112

主题

14683

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部