C语言按位操作符

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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。
  • 示例
    1. int a = 5;    // 二进制: 0101
    2. int b = 3;    // 二进制: 0011
    3. int c = a & b; // 结果: 0001 (十进制1)
    4. printf("%d\n", c); // 输出: 1
    复制代码
  • 典型用途

    • 掩码操作(提取某些位)。
    • 判定奇偶(a & 1 结果为1则是奇数,0则是偶数)。


(2) 按位或(|)



  • 功能:逐位比力两个操作数,只要对应位有一个为1,结果的该位为1。
  • 示例
    1. int a = 5;    // 0101
    2. int b = 3;    // 0011
    3. int c = a | b; // 0111 (十进制7)
    4. printf("%d\n", c); // 输出: 7
    复制代码
  • 典型用途

    • 设置某些位为1(如权限控制)。


(3) 按位异或(^)



  • 功能:逐位比力两个操作数,对应位不同时结果为1,相同时为0。
  • 示例
    1. int a = 5;    // 0101
    2. int b = 3;    // 0011
    3. int c = a ^ b; // 0110 (十进制6)
    4. printf("%d\n", c); // 输出: 6
    复制代码
  • 特性

    • 任何数异或自己结果为0(a ^ a = 0)。
    • 异或0即是原数(a ^ 0 = a)。

  • 典型用途

    • 交换两个变量的值(无需临时变量):
      1. a = a ^ b;
      2. b = a ^ b;
      3. a = a ^ b;
      复制代码
    • 数据加密/简朴校验。


(4) 按位取反(~)



  • 功能:对操作数的全部位取反(0变1,1变0)。
  • 示例
    1. int a = 5;    // 二进制: 0000 0101
    2. int b = ~a;   // 取反: 1111 1010 (补码表示,实际值为-6)
    3. printf("%d\n", b); // 输出: -6
    复制代码
  • 注意

    • 结果取决于变量的范例(如unsigned int和int的结果大概不同)。


(5) 左移(<<)



  • 功能:将操作数的全部位向左移动指定位数,低位补0。
  • 示例
    1. int a = 3;    // 二进制: 0011
    2. int b = a << 2; // 左移2位: 1100 (十进制12)
    3. printf("%d\n", b); // 输出: 12
    复制代码
  • 特性

    • 左移1位相称于乘以2(a << n ≈ a * 2^n)。

  • 用途

    • 快速盘算2的幂次。


(6) 右移(>>)



  • 功能:将操作数的全部位向右移动指定位数,高位补符号位(算术右移)或0(逻辑右移)。
  • 示例
    1. int a = 16;   // 二进制: 0001 0000
    2. int b = a >> 2; // 右移2位: 0000 0100 (十进制4)
    3. printf("%d\n", b); // 输出: 4
    复制代码
  • 特性

    • 右移1位相称于除以2(a >> n ≈ a / 2^n)。

  • 注意

    • 对有符号数,右移行为依靠编译器(通常补符号位)。


3. 常见应用场景


  • 掩码操作(提取/设置特定位)
    1. // 提取低4位
    2. int mask = 0x0F; // 0000 1111
    3. int value = 0x5A; // 0101 1010
    4. int low_bits = value & mask; // 0000 1010 (0xA)
    复制代码
  • 快速乘除2的幂次
    1. int a = 10;
    2. int double_a = a << 1; // 20
    3. int half_a = a >> 1;   // 5
    复制代码
  • 交换变量(无临时变量)
    1. int x = 10, y = 20;
    2. x = x ^ y;
    3. y = x ^ y;
    4. x = x ^ y;
    复制代码
  • 权限控制(用位表示开关)
    1. #define READ   0x1  // 0001
    2. #define WRITE  0x2  // 0010
    3. #define EXEC   0x4  // 0100
    4. int permissions = READ | WRITE; // 0011 (可读可写)
    5. if (permissions & READ) { ... } // 检查读权限
    复制代码

4. 注意事项


  • 区分逻辑操作符(&&、||)和按位操作符(&、|)

    • 逻辑操作符返回0或1,按位操作符返回整数。
    • 示例:
      1. int a = 2, b = 3;
      2. printf("%d\n", a & b);  // 按位与: 2 (二进制 10 & 11 = 10)
      3. 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企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表