马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在C语言中,按位操作符直接对整数的二进制位(bit)进行操作,常用于底层编程、硬件控制或性能优化场景。以下是按位操作符的具体说明和用法:
1. 按位操作符列表
操作符名称功能描述示例&按位与对应位均为1时结果为1,否则为0a & b``按位或对应位至少一个为1时结果为1`ab`^按位异或对应位不同时结果为1,相同时为0a ^ b~按位取反全部位取反(0变1,1变0)~a<<左移全部位向左移动,低位补0a << n>>右移全部位向右移动,高位补符号位或0a >> n 2. 按位操作符详解
(1) 按位与(&)
- 功能:逐位比力两个操作数,只有当对应位均为1时,结果的该位为1。
- 示例:
- int a = 5; // 二进制: 0101
- int b = 3; // 二进制: 0011
- int c = a & b; // 结果: 0001 (十进制1)
- printf("%d\n", c); // 输出: 1
复制代码 - 典型用途:
- 掩码操作(提取某些位)。
- 判定奇偶(a & 1 结果为1则是奇数,0则是偶数)。
(2) 按位或(|)
- 功能:逐位比力两个操作数,只要对应位有一个为1,结果的该位为1。
- 示例:
- int a = 5; // 0101
- int b = 3; // 0011
- int c = a | b; // 0111 (十进制7)
- printf("%d\n", c); // 输出: 7
复制代码 - 典型用途:
(3) 按位异或(^)
- 功能:逐位比力两个操作数,对应位不同时结果为1,相同时为0。
- 示例:
- int a = 5; // 0101
- int b = 3; // 0011
- int c = a ^ b; // 0110 (十进制6)
- printf("%d\n", c); // 输出: 6
复制代码 - 特性:
- 任何数异或自己结果为0(a ^ a = 0)。
- 异或0即是原数(a ^ 0 = a)。
- 典型用途:
- 交换两个变量的值(无需临时变量):
- a = a ^ b;
- b = a ^ b;
- a = a ^ b;
复制代码 - 数据加密/简朴校验。
(4) 按位取反(~)
- 功能:对操作数的全部位取反(0变1,1变0)。
- 示例:
- int a = 5; // 二进制: 0000 0101
- int b = ~a; // 取反: 1111 1010 (补码表示,实际值为-6)
- printf("%d\n", b); // 输出: -6
复制代码 - 注意:
- 结果取决于变量的范例(如unsigned int和int的结果大概不同)。
(5) 左移(<<)
- 功能:将操作数的全部位向左移动指定位数,低位补0。
- 示例:
- int a = 3; // 二进制: 0011
- int b = a << 2; // 左移2位: 1100 (十进制12)
- printf("%d\n", b); // 输出: 12
复制代码 - 特性:
- 左移1位相称于乘以2(a << n ≈ a * 2^n)。
- 用途:
(6) 右移(>>)
- 功能:将操作数的全部位向右移动指定位数,高位补符号位(算术右移)或0(逻辑右移)。
- 示例:
- int a = 16; // 二进制: 0001 0000
- int b = a >> 2; // 右移2位: 0000 0100 (十进制4)
- printf("%d\n", b); // 输出: 4
复制代码 - 特性:
- 右移1位相称于除以2(a >> n ≈ a / 2^n)。
- 注意:
3. 常见应用场景
- 掩码操作(提取/设置特定位)
- // 提取低4位
- int mask = 0x0F; // 0000 1111
- int value = 0x5A; // 0101 1010
- int low_bits = value & mask; // 0000 1010 (0xA)
复制代码 - 快速乘除2的幂次
- int a = 10;
- int double_a = a << 1; // 20
- int half_a = a >> 1; // 5
复制代码 - 交换变量(无临时变量)
- int x = 10, y = 20;
- x = x ^ y;
- y = x ^ y;
- x = x ^ y;
复制代码 - 权限控制(用位表示开关)
- #define READ 0x1 // 0001
- #define WRITE 0x2 // 0010
- #define EXEC 0x4 // 0100
- int permissions = READ | WRITE; // 0011 (可读可写)
- if (permissions & READ) { ... } // 检查读权限
复制代码 4. 注意事项
- 区分逻辑操作符(&&、||)和按位操作符(&、|)
- 逻辑操作符返回0或1,按位操作符返回整数。
- 示例:
- int a = 2, b = 3;
- printf("%d\n", a & b); // 按位与: 2 (二进制 10 & 11 = 10)
- printf("%d\n", a && b); // 逻辑与: 1 (因为a和b均非零)
复制代码
- 移位操作的未定义行为
- 如果右移负数或左移凌驾位数,结果大概未定义(编译器依靠)。
- 无符号数右移补0
- 对unsigned int,右移高位补0;对signed int,通常补符号位。
5. 总结
操作符用途示例&掩码、判定奇偶a & 0x01``设置特定位`flagsREAD`^交换变量、简朴加密a ^ b~位取反~a<<快速乘以2的幂次a << 3>>快速除以2的幂次a >> 2 按位操作符是C语言底层编程的核心工具,合理利用可以提升代码效率和灵活性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|