C++位运算

按位与:

按位与(AND)是一种位操作,用于将两个二进制数字的相应位进行逻辑与操作。其规则如下:

  • 如果两个对应位的值都为1,则结果为1。
  • 否则,结果为0。

在C++中,按位与操作符是 &。下面是一个示例:

int a = 5;      // 二进制表示为 0101
int b = 3;      // 二进制表示为 0011

int result = a & b;   // 对应位的按位与操作
// 0101
// 0011
// ----
// 0001,结果为1

cout << result;  // 输出 1

按位或:

按位或(OR)是一种位操作,用于将两个二进制数字的相应位进行逻辑或操作。其规则如下:

  • 如果两个对应位的值中至少有一个为1,则结果为1。
  • 如果两个对应位的值都为0,则结果为0。

在C++中,按位或操作符是 |。下面是一个示例:

int a = 5;      // 二进制表示为 0101
int b = 3;      // 二进制表示为 0011

int result = a | b;   // 对应位的按位或操作
// 0101
// 0011
// ----
// 0111,结果为7

cout << result;  // 输出 7

按位异或:

按位异或(XOR)是一种位操作,用于比较两个二进制数字的相应位。其规则如下:

  • 如果两个对应位的值相同(都是0或都是1),则结果为0。
  • 如果两个对应位的值不同(一个是0,一个是1),则结果为1。

在C++中,按位异或操作符是 ^。下面是一些示例:

int a = 5;      // 二进制表示为 0101
int b = 3;      // 二进制表示为 0011

int result = a ^ b;   // 对应位的异或操作
// 0101
// 0011
// ----
// 0110,结果为6

cout << result;  // 输出 6

位移:

位移是一种常见的位操作,用于将二进制数字向左或向右移动指定数量的位。在 C++ 中,位移操作符包括左移 << 和右移 >>

左移 (<<):将一个二进制数字向左移动指定的位数。左移操作会在右侧添加指定数量的零,并且可能导致左侧的位丢失。

int num = 5;   // 二进制表示为 0000 0101
int result = num << 2;  // 将 num 向左移动 2 位

// 移动后的结果为 0001 0100,十进制为 20

右移 (>>):将一个二进制数字向右移动指定的位数。右移操作会在左侧添加指定数量的零或符号位,并且可能导致右侧的位丢失。

int num = 20;   // 二进制表示为 0001 0100
int result = num >> 2;  // 将 num 向右移动 2 位

// 移动后的结果为 0000 0101,十进制为 5

 注意事项:

unsigned int num = 5;   // 二进制表示为 0000 0000 0000 0000 0000 0000 0000 0101
unsigned int result = num << 32;  // 将 num 向左移动 32 位

// 移动后的结果为 5

在 C++ 中,对于左移操作,如果移动的位数超过了数据类型的位数,则会对移动的位数取模,即取余数。因此,num 左移 32 位实际上相当于左移 32 % 32 = 0 位,即没有移动。但并不是所有的编译器都会表现出这种行为。因此,在编写跨平台的代码时,最好在进行位移操作时,应该确保移动的位数不会超出数据类型的位数范围。

位运算组合用法示例:

例如,将一个有符号整数的符号位翻转:

int num = -5;  // 二进制表示为 1111 1111 1111 1111 1111 1111 1111 1011

int result = num ^ (1 << 31);  // 对 num 的符号位进行翻转

// 1111 1111 1111 1111 1111 1111 1111 1011
// -----------------------------------------
// 0111 1111 1111 1111 1111 1111 1111 1011,结果为2147483643

cout << result;  // 输出 2147483643

这里,(1 << 31) 用于生成一个只有符号位为1,其余位为0的数,然后使用异或操作将符号位翻转 

相关推荐

  1. C#位移运算运算

    2024-06-06 22:52:02       24 阅读
  2. c++运算

    2024-06-06 22:52:02       33 阅读
  3. C++ 运算

    2024-06-06 22:52:02       28 阅读
  4. C++按运算

    2024-06-06 22:52:02       17 阅读
  5. C++运算

    2024-06-06 22:52:02       12 阅读
  6. C语言基础】运算

    2024-06-06 22:52:02       23 阅读
  7. C# —— 运算符

    2024-06-06 22:52:02       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 22:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 22:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 22:52:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 22:52:02       20 阅读

热门阅读

  1. springboot 解耦、隔离、异步的原则以及实战

    2024-06-06 22:52:02       10 阅读
  2. 图论第三天

    2024-06-06 22:52:02       7 阅读
  3. 这几个大模型产品,你觉得哪个好

    2024-06-06 22:52:02       10 阅读
  4. 神经网络---网络模型的保存、加载

    2024-06-06 22:52:02       9 阅读
  5. 汽车线束搭铁与接地设计原则

    2024-06-06 22:52:02       8 阅读
  6. 双亲委派模型

    2024-06-06 22:52:02       7 阅读
  7. C++构造器设计模式

    2024-06-06 22:52:02       8 阅读
  8. 运维开发详解

    2024-06-06 22:52:02       7 阅读
  9. C++学习笔记

    2024-06-06 22:52:02       7 阅读
  10. 常微分方程 (ODE) 和 随机微分方程 (SDE)

    2024-06-06 22:52:02       12 阅读
  11. 【面试宝藏】Go并发编程面试题

    2024-06-06 22:52:02       6 阅读
  12. Linux学习—Linux环境下的网络设置

    2024-06-06 22:52:02       9 阅读